扁平化列表列表[重复]
Posted
技术标签:
【中文标题】扁平化列表列表[重复]【英文标题】:Flatten list of lists [duplicate] 【发布时间】:2012-07-01 03:44:56 【问题描述】:我在 Python 中遇到了方括号问题。我编写了一个产生以下输出的代码:
[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
但我想用它进行一些计算,但方括号不允许我这样做。
如何删除括号?我看到了一些例子来做到这一点,但我无法将它们应用到这个案例中。
【问题讨论】:
换句话说,您有一个列表列表,并且您希望能够处理内部列表的所有成员?此外,由于所有这些内部列表都有一个值,是否值得确保仅将值插入到外部列表中?或者某些列表是否有可能包含多个元素?尽可能准确地提供所有可能的信息非常重要。 为了帮助人们在未来回答你的问题,尽量避免像“方括号不会让我这样”这样的一般性陈述,而是给出一个具体的例子来说明你试图做的事情没有工作,然后复制并粘贴一个小测试代码,显示结果错误。 相关flatten nested list 如果他们回答了您的问题,您应该接受以下答案之一 【参考方案1】:给定
d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
以及您的具体问题:如何删除括号?
使用列表推导:
new_d = [i[0] for i in d]
会给你这个
[180.0, 173.8, 164.2, 156.5, 147.2, 138.2]
然后您可以使用适当的索引访问单个项目,例如,new_d[0]
将给您180.0
等,然后您可以将其用于数学。
如果您要收集数据,您将有某种括号或括号。
注意,此解决方案专门针对您的问题/问题,它不提供通用解决方案。即,它适用于您的情况。
【讨论】:
OP 对列表一无所知,如果他/她想用它来展平多个元素,给他/她这个解决方案可能会导致不良影响(没有错误,只是默默地返回第一个...... )【参考方案2】:使用嵌套列表推导将列表展平为“删除括号”。这将取消嵌套存储在您的列表列表中的每个列表!
list_of_lists = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
flattened = [val for sublist in list_of_lists for val in sublist]
嵌套列表推导的评估方式与它们展开的方式相同(即为每个新循环添加换行符和制表符。所以在这种情况下:
flattened = [val for sublist in list_of_lists for val in sublist]
相当于:
flattened = []
for sublist in list_of_lists:
for val in sublist:
flattened.append(val)
最大的不同是列表 comp 的计算速度比 unraveled 循环快得多,并且消除了 append 调用!
如果您在子列表中有多个项目,则列表组合甚至会将其展平。即
>>> list_of_lists = [[180.0, 1, 2, 3], [173.8], [164.2], [156.5], [147.2], [138.2]]
>>> flattened = [val for sublist in list_of_lists for val in sublist]
>>> flattened
[180.0, 1, 2, 3, 173.8, 164.2, 156.5, 147.2,138.2]
【讨论】:
使用itertools.chain.from_iterable
要简单得多。
请解释原因。这很简单
对不起,我的意思是更具可读性/直观性。由于 OP 在区分列表是什么(数据序列)和列表在代码中如何表示(使用方括号)之间存在歧义,我非常怀疑双重列表理解对他/她是否有意义。
+1 表示速度提高了两倍以上(计时),不需要导入并且更紧凑-
虽然问题是重复的,但我认为这个答案优于我见过的任何其他答案。我非常喜欢列表理解,但由于某种原因,这种特殊的结构仍然不直观。【参考方案3】:
我会使用itertools.chain
- 这也将满足每个子列表中 > 1 个元素:
from itertools import chain
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]))
【讨论】:
为什么要导入整个模块来做这么简单的事情? @PaulSeeb 最简单、通用、内置的扁平化迭代迭代的方法...如果子列表有 100 个元素怎么办?我当然不想为那个输入 listcomp 代码... 如果子列表有 100 个元素,嵌套列表 comp 仍然可以在不导入整个模块的情况下处理此问题。它主要只是样式和偏好,但我个人认为列表组合更具可读性,因为大多数程序员都使用过列表组合,但并非所有人都阅读了整个 itertools 库。并不是说它很难查找,而是它只是一件事。 不幸的是,chain
在多层嵌套方面与列表推导有相同的缺点(即它不是递归的)。但是,我相信itertools
允许使用高度可读的代码完成许多不错的操作,这就是为什么我仍然支持这个答案而不是使用双重列表理解。
@PlatinumAzure 我正在写作中,当电话响起时,当深度超过 1 级时,它会中断 - 所以那次你打败了我!我还要提到,如果列表不需要具体化,那么只需循环遍历链生成的迭代器可能是一个优势......【参考方案4】:
>>> lis=[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
>>> [x[0] for x in lis]
[180.0, 173.8, 164.2, 156.5, 147.2, 138.2]
【讨论】:
以上是关于扁平化列表列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Medium | LeetCode 341. 扁平化嵌套列表迭代器 | 递归 | 栈
2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化