要求:把40個元素的數組,按每行8個,分5行打印出來。如下圖
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
起因:遇到一些處理數據文件的場景,比如每8行求一次平均值,最大值,或者別的什么操作,可以先抽象為每8行打印到一個數組里,然后直接對該數組處理
1 #!/usr/bin/perl -w 2 use strict; 3 4 my @data = 1..40; 5 6 my $window = 8; 7 8 for my $loop(0..(@data/$window)-1) 9 { 10 my @tmp = (); 11 for my $index (0..($window-1)) 12 { 13 push @tmp, $data[$index + $window * $loop]; 14 } 15 print join("\t", @tmp), "\n"; 16 }
分析:原理很簡單,找到索引的規律,就是了,只是每次不能快速的想起來,特此記錄一下。關鍵是用line8, line13, 找到索引的正確公式。
0+8*0, 1+8*0, ... 7+8*0
0+8*1, 1+8*1, ... 7+8*1
...
0+8*4, 1+8*4, ... 7+8*4
推廣: 其他語言也可以按這個思路做
1 #!/usr/bin/python 2 3 data = range(40) 4 5 window = 8 6 7 for loop in range(len(data)/window): 8 tmp = [] 9 for index in range(window): 10 tmp.append(data[index + window * loop]) 11 #print tmp 12 print "\t".join([str(x) for x in tmp])
不太好的思路:一開始是想到等差數列公式,先求出每行(代表一行數組)的第一個值,后面的根據等差數列公式a1+(n-1)*d,依次求出, 代碼有點啰嗦
1 #!/usr/bin/perl -w 2 use strict; 3 4 my @data = 1..40; 5 6 my $window = 8; 7 my $offset = 1; 8 9 my @tmp = (); 10 for my $loop(0..(@data/$window - 1)) 11 { 12 my $first = $data[0] + $loop * $window; 13 for my $index(1..$window) 14 { 15 my $value = $first + ($index - 1) * $offset; 16 push @tmp, $value; 17 } 18 print "@tmp\n"; 19 @tmp = (); 20 }