2009-09-23 19 views

Trả lời

12

Python

print list[::3] # print it 
newlist = list[::3] # copy it 

Perl

for ($i = 0; $i < @list; $i += 3) { 
    print $list[$i]; # print it 
    push @y, $list[$i]; # copy it 
} 
+0

@friedo: Cảm ơn bạn đã sửa chữa :) – tuergeist

8

Python:

for x in a[::3]: 
    something(x) 
+3

Đẹp. Python lát cho tôi cương cứng. –

+3

http://en.wikipedia.org/wiki/Diphallia? – u0b34a0f6ae

2

Trong Perl:

$size = @array; 
for ($i=0; $i<$size; $i+=3) # or start from $i=2, depends what you mean by "every third index" 
{ 
     print "$array[$i] "; 
} 
9

Perl 5.10 state biến mới có rất tiện dụng ở đây:

my @every_third = grep { state $n = 0; ++$n % 3 == 0 } @list; 


Cũng lưu ý bạn có thể cung cấp một danh sách các yếu tố để cắt:

my @every_third = @list[ 2, 5, 8 ]; # returns 3rd, 5th & 9th items in list 

Bạn có thể tự động tạo danh sách miếng này bằng map (xem Gugod của xuất sắc answer) hoặc chương trình con:

my @every_third = @list[ loop(start => 2, upto => $#list, by => 3 ) ]; 

sub loop { 
    my (%p) = @_; 
    my @list; 

    for (my $i = $p{start} || 0; $i <= $p{upto}; $i += $p{by}) { 
     push @list, $i; 
    } 

    return @list; 
} 


Cập nhật:

Về bình luận runrig của ... đây là "một trong những cách" để làm cho nó hoạt động trong vòng một vòng lặp:

my @every_third = sub { grep { state $n = 0; ++$n % 3 == 0 } @list }->(); 
+0

là trạng thái tốt. Nhưng nếu bạn thực hiện dòng đó nhiều lần, nó sẽ chỉ hoạt động lần đầu tiên trừ khi độ dài danh sách là bội số của 3. – runrig

+0

Cũng được chỉ ra. Tính năng hơi khó chịu nhưng không đáng ngạc nhiên của các biến trạng thái mà u có thể nhận được xung quanh bằng cách đóng gói trong một phụ ẩn danh (xem bản cập nhật của tôi). – draegtun

+1

Tại sao không làm 'map {$ _ * 3} 0 .. $ MAX/3' và sử dụng nó cho chỉ mục slice của bạn? –

16

Perl:

Như với câu trả lời của draegtun, nhưng sử dụng số đếm var:

my $i; 
my @new = grep {not ++$i % 3} @list; 
+8

Và có thể được đặt trong một khối: my @new = do {my $ i; grep {not ++ $ i% 3} @list}; – draegtun

1
 
@array = qw(1 2 3 4 5 6 7 8 9); 
print @array[(grep { ($_ + 1) % 3 == 0 } (1..$#array))]; 
9

Perl:

# The initial array 
my @a = (1..100); 

# Copy it, every 3rd elements 
my @b = @a[ map { 3 * $_ } 0..$#a/3 ]; 

# Print it. space-delimited 
$, = " "; 
say @b; 
5

Bạn có thể làm một lát trong Perl.

my @in = (1..10); 

# need only 1/3 as many indexes. 
my @index = 1..(@in/3); 

# adjust the indexes. 
$_ = 3 * $_ - 1 for @index; 
# These would also work 
# $_ *= 3, --$_ for @index; 
# --($_ *= 3) for @index 

my @out = @in[@index]; 
Các vấn đề liên quan