按固定元素数目分割数组- perl,python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按固定元素数目分割数组- perl,python相关的知识,希望对你有一定的参考价值。

要求:把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 }

 

以上是关于按固定元素数目分割数组- perl,python的主要内容,如果未能解决你的问题,请参考以下文章

delphi如何按固定的分隔符来分割字符串,并且把分割出来的字符串放到数组中?具体的代码如何实现?

perl inline:autosplit不会将ls命令分割为@F数组

explode() 函数

perl 第六弹 变量 II

MySQL中数组的存储

python将列表元素按指定数目分组