扁平化列表列表[重复]

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]

【讨论】:

以上是关于扁平化列表列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 341 扁平化嵌套列表迭代器

Medium | LeetCode 341. 扁平化嵌套列表迭代器 | 递归 | 栈

扁平化列表列表,用特定值替换空子列表

2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

使用 pandas json_normalize 扁平化包含多个嵌套列表的字典列表

扁平化(不规则)Python 中关于 Pandas Dataframes 的列表列表