将列表切分为子列表
如何将一个列表简单而有效地切分成多个小列表呢?这些小列表的长度可以是任意的。
比如说,如果我们的原始列表是:
input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]
而我们想要的小列表长度是3,那么我们希望得到:
output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]
同样,如果我们的小列表长度是4,那么我们希望得到:
output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]
4 个回答
10
这是一个非常符合Python风格的写法(适用于Python 3):
list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3))
这里创建了一个列表的迭代器,然后用同一个迭代器创建了三个副本,接着把它们组合成一个元组,再解包成zip,最后又转换成列表。通过zip,每个迭代器都取出一个值,但因为只有一个迭代器对象,所以它的内部计数器对三个副本都是共享的,也就是说,取值的时候会影响到所有三个。
17
itertools
模块的文档里有一个很有用的示例:
import itertools
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
这个函数会返回一个生成器,里面包含了指定长度的元组:
>>> list(grouper(2, [1,2,3,4,5,6,7]))
[(1, 2), (3, 4), (5, 6), (7, None)]
103
[input[i:i+n] for i in range(0, len(input), n)] # Use xrange in py2k
这里的 n
是一个块的长度。
因为你没有说明当 input
中的元素数量不能被 n
整除时,新列表的最后一个元素会发生什么,所以我假设这并不重要:比如如果 n
是 7,那么最后一个元素会是 2。