У меня есть следующий элемент списка, и список состоит из 100 элементов.
[(50, (2.7387451803816479e-13, 219))]
Как преобразовать каждый элемент, чтобы он выглядел так?
[(50, 2.7387451803816479e-13, 219)]
У меня есть следующий элемент списка, и список состоит из 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)]
Это может быть полезно, если у вас есть вложенный кортеж, используемый для ведения записей со многими элементами, которые вы хотите сгладить.
Вы можете использовать следующую функцию и применить ее в цикле к каждому элементу в списке.
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, это перезапустит генератор, который сглаживает tuple
с помощью recursive
и yield
.
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 способ сделать то, что Митч предлагает для 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)]
Преимущество этого метода заключается в том, что вам не нужно искать имя переменной для каждого значения внутреннего кортежа, чтобы сгладить его, как в принятом ответе. Если есть два или три элемента, это не проблема, но представьте, что есть значения в десятых долях или больше...