【问题标题】:Slicing a list into a list of sub-lists [duplicate]将列表切片为子列表列表[重复]
【发布时间】:2011-01-14 22:58:09
【问题描述】:

对于任意长度的子列表,将列表切片为切片的子列表部分列表的最简单且合理有效的方法是什么?

例如,如果我们的源列表是:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]

我们的子列表长度是 3 然后我们寻找:

output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]

同样,如果我们的子列表长度为 4,那么我们会寻找:

output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]

【问题讨论】:

  • 您可能有兴趣讨论这个问题(stackoverflow.com/questions/2095637
  • 您可以使用 numpy 的 array_split 函数,例如 np.array_split(np.array(data), 20) 分割成 20 个几乎相等大小的块。为确保块大小完全相同,请使用np.split

标签: list python


【解决方案1】:
[input[i:i+n] for i in range(0, len(input), n)]        # Use xrange in py2k

其中n 是块的长度。

由于您没有定义当input 中的元素数量不能被n 整除时新列表的最后一个元素会发生什么,我认为这并不重要:有了这个,您将例如,如果n 等于 7,则获取最后一个元素等于 2。

【讨论】:

    【解决方案2】:

    itertools 模块的文档包含以下recipe

    import itertools
    
    def grouper(n, iterable, fillvalue=None):
        "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
        args = [iter(iterable)] * n
        return itertools.izip_longest(fillvalue=fillvalue, *args)
    

    此函数返回所需长度的元组的迭代器:

    >>> list(grouper(2, [1,2,3,4,5,6,7]))
    [(1, 2), (3, 4), (5, 6), (7, None)]
    

    【讨论】:

    • 虽然这适用于任何可迭代对象,但在应用于给定任务时,它似乎不如我的代码高效(至少在我的测试中)。
    • @SilentGhost,过早优化?
    【解决方案3】:

    一个真正的pythonic变体(python 3):

    list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3))
    

    创建一个列表迭代器并将其转换为具有 3 倍相同迭代器的元组,然后解压缩为 zip 并再次转换为列表。通过 zip 从每个迭代器中提取一个值,但由于只有一个迭代器对象,因此内部计数器对所有三个都全局增加。

    【讨论】:

    • 这个解决方案很棒,但如果我不得不考虑 python 的禅宗,我会说它不是很“pythonic”:P
    • 没错,这是一个非pythonic的pythonic解决方案;-)
    • 如果列表的 len 的 mod 不为 0,则不起作用!
    • 不起作用!
    【解决方案4】:

    我喜欢 SilentGhost 的解决方案。

    我的解决方案在 python 中使用函数式编程:

    group = lambda t, n: zip(*[t[i::n] for i in range(n)])
    group([1, 2, 3, 4], 2)
    

    给予:

    [(1, 2), (3, 4)]
    

    这假设输入列表大小可以被组大小整除。如果不是,则不包含未配对的元素。

    【讨论】:

    • 您的第二个示例仅限于 python-2.x。在 py3k 中,map 不能将 None 作为第一个参数。
    • @SilentGhost:你说得对,不过我要删除它。
    猜你喜欢
    • 2014-01-16
    • 1970-01-01
    • 2015-05-09
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-09-07
    相关资源
    最近更新 更多