假设我有一个任意长度L的列表:
L = list(range(1000))
将列表分成几组的最佳方法是n什么?这是我能够想到的最佳结构,由于某种原因,它似乎并不是完成任务的最佳方法:
n
n = 25 for i in range(0, len(L), n): chunk = L[i:i+25]
有内置的功能可以做到这一点吗?
编辑: 早期的答案是将我的for循环重新制作为listcomp,这不是这个主意;您基本上是用另一种形式给我我的确切答案。我正在查看是否有替代方法可以完成此任务,例如.split列表上的假设或类似内容。我也在昨晚编写的一些代码中将其用作生成器:
.split
def split_list(L, n): assert type(L) is list, "L is not a list" for i in range(0, len(L), n): yield L[i:i+n]
甲的Python配方(在Python 2.6,使用itertools.izip_longest):
itertools.izip_longest
def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return itertools.zip_longest(*args, fillvalue=fillvalue)
用法示例:
>>> list(grouper(3, range(9))) [(0, 1, 2), (3, 4, 5), (6, 7, 8)] >>> list(grouper(3, range(10))) [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]
如果您希望最后一组短于其他组而不是用填充fillvalue,则可以例如更改如下代码:
fillvalue
>>> def mygrouper(n, iterable): ... args = [iter(iterable)] * n ... return ([e for e in t if e != None] for t in itertools.zip_longest(*args)) ... >>> list(mygrouper(3, range(9))) [[0, 1, 2], [3, 4, 5], [6, 7, 8]] >>> list(mygrouper(3, range(10))) [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]