【问题标题】:Python convert list of nested tuples to list of tuplesPython将嵌套元组列表转换为元组列表
【发布时间】:2017-09-11 13:13:51
【问题描述】:

我有一个嵌套元组列表

[(('p1', 'p2'), ('m1',)), (('p2', 'p1'), ('m1',))]

如何将其转换为元组列表

[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')]

不使用for循环

【问题讨论】:

  • 元组嵌套的深度是否任意?还是只有两层?
  • 固定,只有两层
  • 列表理解中是否允许fors?这只是一种不同的for 循环,真的。
  • 为什么不想使用for?这是作业吗?到目前为止你做了什么?请向我们展示您的代码。

标签: python list tuples


【解决方案1】:

您可以将 list comprehensiongenerator 一起用作 tuple(..) 构造函数中的元素:

[tuple(<b>x for elem in row for x in elem</b>) for row in data]

粗体中的代码片段是一个生成器:对于每个row(即(('p1', 'p2'), ('m1',))),它会产生两层深的元素,因此:@987654325 @、p2m1。这些被转换成tuple

或者你可以使用itertools:

from itertools import chain

[tuple(chain(*row)) for row in data]

这会生成:

>>> data = [(('p1', 'p2'), ('m1',)), (('p2', 'p1'), ('m1',))]
>>> [tuple(x for elem in row for x in elem) for row in data]
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')]
>>> [tuple(chain(*row)) for row in data]
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')]

您还可以使用itertools.starmap(..)list(..) 删除列表推导:

from itertools import chain, starmap

list(map(tuple,starmap(chain,data)))

这给出了:

>>> list(map(tuple,starmap(chain,data)))
[('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')]

请注意,尽管您自己编写 for 循环,但在列表解析或 map(..)starmap(..) 函数中当然仍然存在循环机制。

【讨论】:

  • 我可以使用 itertools 中的一些东西来做到这一点,比如 chain(*) 之类的东西。不确定。不想用“for”
  • @Nitin:是的。这是另一种方法。如图所示。
【解决方案2】:

您可以使用itertools.chain

In [91]: from itertools import chain
In [92]: [tuple(chain(*item)) for item in a]
Out[92]: [('p1', 'p2', 'm1'), ('p2', 'p1', 'm1')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多