展平列表清单

Hel*_*ish 86 python arrays brackets list

我在Python中使用方括号有问题.我写了一个产生以下输出的代码:

[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
Run Code Online (Sandbox Code Playgroud)

但我想用它来进行一些计算,但方括号不会让我.

如何删除括号?我看到了一些例子,但我不能将它们应用于这种情况.

Pau*_*eeb 150

使用嵌套列表推导将列表展平为"删除括号".这将取消嵌套存储在列表列表中的每个列表!

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]
Run Code Online (Sandbox Code Playgroud)

嵌套列表推导的评估方式与它们解包的方式相同(即为每个新循环添加换行符和制表符.所以在这种情况下:

flattened = [val for sublist in list_of_lists for val in sublist]
Run Code Online (Sandbox Code Playgroud)

相当于:

flattened = []
for sublist in list_of_lists:
    for val in sublist:
        flattened.append(val)
Run Code Online (Sandbox Code Playgroud)

最大的区别是list comp比unraveled循环更快地评估MUCH并消除了追加调用!

如果子列表中有多个项目,则列表组合甚至会使其变平.即

>>> 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]
Run Code Online (Sandbox Code Playgroud)

  • 使用`itertools.chain.from_iterable`要简单得多. (20认同)
  • +超过两倍(时间),不需要导入,更紧凑 - (7认同)
  • 对不起,我的意思更具可读性/直观性.由于OP难以消除哪些列表(数据序列)和列表如何在代码中表示(带方括号),我非常怀疑双列表理解对他/她有意义. (6认同)
  • 请解释原因.这很简单 (4认同)
  • 虽然问题是重复的,但我认为这个答案优于我见过的任何其他答案。我非常喜欢列表理解,但由于某种原因,这种特殊的构造仍然不直观。 (2认同)

Jon*_*nts 102

我会使用itertools.chain- 这也将满足每个子列表中> 1个元素:

from itertools import chain
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]))
Run Code Online (Sandbox Code Playgroud)

  • 为什么要导入整个模块来做一些像这样简单的事情? (8认同)
  • 对于`itertools` +1,只是想发布一个类似的答案,但你打败了我。 (3认同)
  • @PaulSeeb 扁平化可迭代对象的最简单、通用、内置的方法方式……如果子列表有 100 个元素怎么办?我当然不想为那个输入 listcomp 代码...... (3认同)
  • 如果子列表有100个元素,嵌套列表comp仍然可以处理这个而不导入整个模块.它主要是风格和偏好,但我个人认为列表comp更具可读性,因为大多数程序员使用了list comps但并非所有人都阅读了整个itertools库.并不是它难以查找,而是它还有一件事. (2认同)
  • 不幸的是,在多层嵌套方面,`chain` 与列表推导式具有相同的缺点(即它不是递归的)。但是,我相信 `itertools` 允许使用高度可读的代码完成许多不错的操作,这就是为什么我仍然支持这个答案而不是使用双重列表理解。 (2认同)

Lev*_*von 18

特定

d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
Run Code Online (Sandbox Code Playgroud)

和您的具体问题: 如何删除括号?

使用列表理解:

new_d = [i[0] for i in d]
Run Code Online (Sandbox Code Playgroud)

会给你这个

[180.0, 173.8, 164.2, 156.5, 147.2, 138.2]
Run Code Online (Sandbox Code Playgroud)

然后你可以使用适当的索引访问单个项目,例如,new_d[0]会给你180.0等,然后你可以用它们进行数学运算.

如果您要拥有一组数据,您将拥有某种括号或括号.

请注意,此解决方案专门针对您的问题/问题,它不提供通用解决方案.即,它适用于您的情况.

  • OP对列表一无所知,如果他/她希望使用它来展平多个元素(没有错误,只是默默地返回第一个......),这个解决方案可能会导致他/她的这种解决方案. (9认同)