Ответ 1
[(a, b, c) for a, (b, c) in l]
Упаковка и распаковка пакетов решает проблему.
У меня есть следующий элемент списка, и список имеет длину 100 элементов.
[(50, (2.7387451803816479e-13, 219))]
Как преобразовать каждый элемент, чтобы выглядеть так?
[(50, 2.7387451803816479e-13, 219)]
[(a, b, c) for a, (b, c) in l]
Упаковка и распаковка пакетов решает проблему.
Новое в 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
Надеюсь, это поможет кому-то:)