我想编写一个从列表中获取项目并将它们分组为大小为n的组的函数。
即,对于n = 5,[1,2,3,4,5,6,7]将变为[[1,2,3,4,5],[6,7]]。
最好的python惯用方法是什么?
答案 0 :(得分:2)
你可以这样做:
[a[x:x+n] for x in range(0, len(a), n)]
(在Python 2中,使用xrange
提高效率;在Python 3中使用range
,如上所述。)
答案 1 :(得分:1)
我不知道有什么好的命令可以做到这一点,但是这是一种用列表理解来做到这一点的方法:
l = [1,2,3,4,5,6,7]
n = 5
newlist = [l[i:i+n] for i in range(0,len(l),n)]
编辑:正如评论者指出的那样,我不小心把l [i:i + n]放在一个列表中。
答案 2 :(得分:1)
使用带有步骤的范围的解决方案仅适用于列表和元组(非迭代器)等序列。它们也没有那么高效,因为它们多次访问序列而不是迭代它一次。
这是一个支持迭代器的版本,只迭代输入一次,创建一个列表列表:
def blockify(iterator, blocksize):
"""Split the items in the given iterator into blocksize-sized lists.
If the number of items in the iterator doesn't divide by blocksize,
a smaller block containing the remaining items is added to the result.
"""
blocks = []
for index, item in enumerate(iterator):
if index % blocksize == 0:
block = []
blocks.append(block)
block.append(item)
return blocks
现在,返回元组迭代器的迭代器版本没有内存开销,并允许选择是否包含余数。请注意,输出可以通过列表转换为列表(blockify(...))。
from itertools import islice
def blockify(iterator, blocksize, include_remainder=True):
"""Split the items in the given iterator into blocksize-sized tuples.
If the number of items in the iterator doesn't divide by blocksize and
include_remainder is True, a smaller block containing the remaining items
is added to the result; if include_remainder is False the remaining items
are discarded.
"""
iterator = iter(iterator) # we need an actual iterator
while True:
block = tuple(islice(iterator, blocksize))
if len(block) < blocksize:
if len(block) > 0 and include_remainder:
yield block
break
yield block
答案 3 :(得分:0)
[a[n*k:n*(k+1)] for k in range(0,len(a)/n+1)]