【问题标题】:How to create 2D lists out of a 1D list in python depending upon a length如何根据长度在python中从一维列表中创建二维列表
【发布时间】:2017-05-09 11:31:27
【问题描述】:

我有一个列表[1,2,3,4,5,6,7,8,9]。我想根据它创建 2D 列表 长度。 假设我的长度为 3,2,4 所以结果列表必须像[[1,2,3],[4,5],[6,7,8,9]]。 任何人都可以提出一些方法来实现这一目标吗?

【问题讨论】:

    标签: python python-2.7 list split


    【解决方案1】:

    你可以通过itertools.islice简单地做到这一点:

    >>> from itertools import islice
    >>> lst = [1,2,3,4,5,6,7,8,9]
    >>> it = iter(lst)
    >>> [list(islice(it,i)) for i in [3,2,4]]
    [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
    

    【讨论】:

    • itertools.islice 是一个不错的选择。它对我有用,而且非常简单。谢谢
    【解决方案2】:

    你可以这样做:

    def subdiv(sliceable,lengths):
        idx = 0
        for length in lengths:
            yield sliceable[idx:idx+length]
            idx += length
    

    那么你可以这样称呼它:

    >>> list(subdiv([1,2,3,4,5,6,7,8,9],[3,2,4]))
    [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
    

    此方法适用于所有支持切片的事物。例如元组:

    >>> list(subdiv((1,2,3,4,5,6,7,8,9),[3,2,4]))
    [(1, 2, 3), (4, 5), (6, 7, 8, 9)]
    

    最后,lengths 可以源自任何类型的可迭代对象(列表、元组、生成器等)。

    【讨论】:

    • 因为我的程序只需要一次,所以我可以跳过使用方法。
    • @BiswajitMaharana:是的,但是这个操作看起来很常见,所以你可以将它定义为你在不同项目之间共享的“实用方法”。
    • 我同意使用函数是明智的,但与使用 itertools.islice 相比,我认为这样做没有任何优势?
    • @Chris_Rands:iirc 切片列表通常比islice 更有效,因为在这里您使用的是可迭代对象。因此,list(..) 构造函数现在不会提前调整大小,因此可能会“扩展”几次。但我同意没有太大的优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多