我有以下列表元素,列表长度为100个元素。如何在python中压扁元组
[(50, (2.7387451803816479e-13, 219))]
如何将每个元素转换为这样的样子?
[(50, 2.7387451803816479e-13, 219)]
我有以下列表元素,列表长度为100个元素。如何在python中压扁元组
[(50, (2.7387451803816479e-13, 219))]
如何将每个元素转换为这样的样子?
[(50, 2.7387451803816479e-13, 219)]
[(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)]
这可能是有用的,如果你有使用记录嵌套元组与许多你想要扁平化的元素保持一致。
您可以用这种方式
>> example = [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example]
[(50, 2.738745180381648e-13, 219)]
一个Python 2.7兼容的方式做什么米奇提出的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)]
这种方法的好处是,你不必为内部元组拼合像接受的答案的每个值找到一个变量名。如果有两个或三个项目,这不是一个问题,但想象有十分之一的值或更多......
您可以使用以下函数并将其应用于循环中的每个元素。
import type
def flatten(T):
if type(T) != types.TupleType: return (T,)
elif len(T) == 0: return()
else: return flatten(T[0]) + flatten(T[1:])
它是如何工作的:
在这个解决方案的好处是:
代码稍微从以下源,其适于:
https://mail.python.org/pipermail/tutor/2001-April/005025.html
希望它可以帮助别人:)
答案中的链接到底如何帮助解决这个问题? – GreenAsJade
当你知道元组结构时,它可以工作,但有时它需要被平坦化的原因是因为结构是未知的。例如np.where可以返回一个具有单值的元组或者具有值列表的元组,在这种情况下,元组需要以不同的方式访问。这种情况如何处理? – DanGoodrick
@DanGoodrick:np.where不这样做。该元组从不包含列表;它总是一个numpy数组的元组,除了具有0维数组的奇怪边缘情况外,数组的数量总是等于输入数组的维数。在不同的情况下,不需要以不同的方式访问元组,而将其扁平化没有多大意义。 – user2357112