python教程—将列表分成n个组的另一种方法[重复]-Python实用宝典

python教程—将列表分成n个组的另一种方法[重复]

这个问题已经有答案了:假设我有一个任意长度的列表,L:把这个列表分成n组的最好方法是什么?这是我能想到的最好的结构,但出于某种原因,我觉得这并不是完成任务的最佳方式:

这个问题已经有了答案:

假设我有一个任意长度的列表,L:

    L = list(range(1000))

把这个列表分成n组的最好方法是什么?这是我能想到的最好的结构,但出于某种原因,我觉得这并不是完成任务的最佳方式:

    n = 25 for i in range(0, len(L), n): chunk = L[i:i+25]

是否有一个内置的来做这件事,我错过了?

编辑:早期的答案是把我的for循环重做到一个listcomp,这不是我的想法;你基本上是以另一种形式给出了我的确切答案。我想看看是否有其他的方法来实现这个,比如一个假设的。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]

回答

一个< A href="http://docs.python.org/3.1/library/itertools.html#recipes" rel="noreferrer">Python recipe(在Python 2.6中,使用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,那么你可以这样修改代码:

    >>> 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]]

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论