如何提取嵌套列表? [复制]
Posted
技术标签:
【中文标题】如何提取嵌套列表? [复制]【英文标题】:how to extract nested lists? [duplicate] 【发布时间】:2012-01-09 19:14:33 【问题描述】:重复:
Flattening a shallow list in Python Comprehension for flattening a sequence of sequences?
假设我有一个带有嵌套列表的列表:
[["a","b","c"], ["d","e","f"], ["g","h","i","j"]...]
将它转换为这样的单个列表的最佳方法是什么
["a", "b", "c", "d", "e"....]
【问题讨论】:
虽然这可能是 something 的副本,但它不是链接问题的副本,它是关于创建一个类似[["a", "d", "g"], ["a", "d", "h"], ["a", "d", "i"], ...]
的列表,而这根本不是什么想要在这里。
@agf 用实际重复替换了可能的重复
【参考方案1】:
使用itertools.chain
:
from itertools import chain
list(chain.from_iterable(list_of_lists))
【讨论】:
你可以解释更多。 @GLHF 这是一个直截了当的问题(以及超过 4 岁),实际上不需要比我链接到的文档和我给出的示例更多的解释。【参考方案2】:使用itertools.chain
的替代解决方案是:
>>> li = [["a","b","c"], ["d","e","f"], ["g","h","i","j"]]
>>> chained = []
>>> while li:
... chained.extend(li.pop(0))
...
>>> chained
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
编辑: 上面的示例将在构建新列表时消耗您的原始列表,因此如果您正在操作非常大的列表并希望最大限度地减少内存使用,这应该是一个优势。如果不是这种情况,我会考虑使用itertools.chain
更多pythonic的方式来达到效果。
【讨论】:
谢谢。我尝试使用 list(itertools.chain(*a)) 但此消息总是出现 TypeError: object of type 'NoneType' has no len() 当我在上面的一个简单列表上尝试它时它工作正常但是当我在更长更复杂的设备上尝试了它,它向我显示了这个错误。也许它与有很多空嵌套列表([])有关? @user1040563 你到底试过什么?对我来说,这两种解决方案(我的和 agf 的工作正常,即使子列表为空......)。 这比chain
或类似解决方案具有更高的时间复杂度,因为pop(0)
是O(n) -- 请参阅Python Wiki Time Complexity 页面的“列表部分”的“删除项目”条目。如果你想使用extend
并让整个事情成为线性时间,那就是for sublist in li: chained.extend(li)
——没有额外的存储空间(我假设是你试图避免的)。
@agf - 事实上,我认为在构建新列表时使用原始列表是该解决方案的“附加值”......感谢您提供指向时间复杂度页面的链接。我忽略了它的存在。有趣的! :)
我不同意这个版本适合非常大的列表。如果子列表很短,但由于 O(总长度 * 子列表的数量)复杂性而有很多子列表,那肯定很糟糕。如果子列表很长但数量不多,这可能会节省内存,但请记住,第二个列表的内存使用仅用于对象的 references在子列表中,不会复制对象,因此内存必须非常紧张。【参考方案3】:
在itertools
文档中有一个直接的示例(请参阅http://docs.python.org/library/itertools.html#recipes 查找flatten()
),但它很简单:
>>> from itertools import chain
>>> list(chain(*x))
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
或者,它可以很容易地在单个列表理解中完成:
>>> x=[["a","b","c"], ["d","e","f"], ["g","h","i","j"]]
>>> [j for i in x for j in i]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
或通过reduce()
:
>>> from operator import add
>>> reduce(add, x)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
【讨论】:
chain.from_iterable(x)
是 chain(*x)
的现代 Python 习语。
列表理解更 Pythonic!
list.__add__
也可以,不需要从运营商导入添加以上是关于如何提取嵌套列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup:如何从包含一些嵌套 <ul> 的 <ul> 列表中提取所有 <li>?