将列表分成n组的另一种方法[重复]

发布于 2021-01-29 14:55:40

这个问题已经在这里有了答案

迭代访问列表的最“ pythonic”方法是什么? (37个答案)

5年前关闭。

假设我有一个任意长度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]
关注者
0
被浏览
105
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    的Python配方(在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]]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看