干得好:
list_of_groups = zip(*(iter(the_list),) * group_size)
例:
print zip(*(iter(range(10)),) * 3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
如果元素的数目不能被N整除,但您仍想包含它们,则可以使用izip_longest,但仅从python 2.6起可用
izip_longest(*(iter(range(10)),) * 3)
结果是生成器,因此如果要打印它,则需要将其转换为列表。
最后,如果您没有python 2.6并使用旧版本,但仍然希望获得相同的结果,则可以使用map:
print map(None, *(iter(range(10)),) * 3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]
我想在到目前为止介绍的不同方法之间添加一些速度比较:
python -m timeit -s 'from itertools import izip_longest; L = range(1000)' 'list(izip_longest(*(iter(L),) * 3))'
10000 loops, best of 3: 47.1 usec per loop
python -m timeit -s 'L = range(1000)' 'zip(*(iter(L),) * 3)'
10000 loops, best of 3: 50.1 usec per loop
python -m timeit -s 'L = range(1000)' 'map(None, *(iter(L),) * 3)'
10000 loops, best of 3: 50.7 usec per loop
python -m timeit -s 'L = range(1000)' '[L[i:i+3] for i in range(0, len(L), 3)]'
10000 loops, best of 3: 157 usec per loop
python -m timeit -s 'import itertools; L = range(1000)' '[list(group) for key, group in itertools.groupby(L, lambda k: k//3)]'
1000 loops, best of 3: 1.41 msec per loop
列表理解和分组方法显然比zip,izip_longest和map慢