【发布时间】:2013-09-01 06:32:47
【问题描述】:
我有一个列表的以下元素,该列表有 100 个元素。
[(50, (2.7387451803816479e-13, 219))]
如何将每个元素转换成这样?
[(50, 2.7387451803816479e-13, 219)]
【问题讨论】:
标签: python list tuples flatten
我有一个列表的以下元素,该列表有 100 个元素。
[(50, (2.7387451803816479e-13, 219))]
如何将每个元素转换成这样?
[(50, 2.7387451803816479e-13, 219)]
【问题讨论】:
标签: python list tuples flatten
[(a, b, c) for a, (b, c) in l]
Tuple packing and unpacking 解决了这个问题。
【讨论】:
Python 3.5 中的新增功能,在PEP 448 中引入了额外的元组解包,您可以在元组文字中使用星号表达式,以便您可以使用
>>> l = [(50, (2.7387451803816479e-13, 219)), (40, (3.4587451803816479e-13, 220))]
>>> [(a, *rest) for a, rest in l]
[(50, 2.738745180381648e-13, 219), (40, 3.458745180381648e-13, 220)]
如果您有一个嵌套元组用于记录保存许多要展平的元素,这可能会很有用。
【讨论】:
您可以使用以下函数并将其循环应用到列表中的每个元素。
def flatten(data):
if isinstance(data, tuple):
if len(data) == 0:
return ()
else:
return flatten(data[0]) + flatten(data[1:])
else:
return (data,)
它是如何工作的:
这个解决方案的好处是:
代码略微改编自以下来源:
https://mail.python.org/pipermail/tutor/2001-April/005025.html
希望它可以帮助某人:)
【讨论】:
对@sagacity 答案的改进,这将重新运行生成器,使用recursive 和yield 将tuple 展平。
def flatten(data):
if isinstance(data, tuple):
for x in data:
yield from flatten(x)
else:
yield data
要使其成为list 或tuple,请使用list() 或tuple()。
list(flatten_tuple(nested_tuple))
tuple(flatten_tuple(nested_tuple))
如果它需要在 Python 2 中工作,请将 yield from 替换为另一个循环:
def flatten(data):
if isinstance(data, tuple):
for x in data:
for y in flatten(x):
yield y
else:
yield data
【讨论】:
这样就可以得到结果
>> example = [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example]
[(50, 2.738745180381648e-13, 219)]
【讨论】:
一种与 Python 2.7 兼容的方式来执行 Mitch 为 Python 3.5 建议的操作。
>>> example = [(50, (2.7387451803816479e-13, 219)),
(100, (3.7387451803816479e-13, 218))]
>>> [(lambda *x: x)(k, *r) for k, r in example]
[(50, 2.738745180381648e-13, 219), (100, 3.7387451803816477e-13, 218)]
这种方法的优点是您不必像接受的答案那样为内部元组的每个值找到一个变量名来展平。如果有两个或三个项目,那不是真正的问题,但想象一下有十分之一或更多的值......
【讨论】: