Как сгладить кортеж в python

У меня есть следующий элемент списка, и список состоит из 100 элементов.

[(50, (2.7387451803816479e-13, 219))]

Как преобразовать каждый элемент, чтобы он выглядел так?

[(50, 2.7387451803816479e-13, 219)]

person olliepower    schedule 29.08.2013    source источник


Ответы (6)


[(a, b, c) for a, (b, c) in l]

упаковка и распаковка кортежей решает эту проблему.

person user2357112 supports Monica    schedule 29.08.2013
comment
Как именно ссылка в ответе помогает с этой проблемой? - person GreenAsJade; 10.10.2014
comment
Это работает, когда вы знаете структуру кортежа, но иногда причина, по которой его необходимо сгладить, заключается в том, что структура неизвестна. например np.where может возвращать кортеж с одним значением или кортеж со списком значений, и в этом случае доступ к кортежу должен быть другим. Как можно справиться с этой ситуацией? - person DanGoodrick; 20.08.2015
comment
@DanGoodrick: np.where этого не делает. Кортеж никогда не содержит списка; это всегда кортеж массивов numpy, и, за исключением странного пограничного случая с 0-мерными массивами, количество массивов всегда равно размерности входного массива. Нет необходимости обращаться к кортежу по-разному в разных случаях, и сглаживание его не имеет особого смысла. - person user2357112 supports Monica; 21.08.2015

Новое в 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)]

Это может быть полезно, если у вас есть вложенный кортеж, используемый для ведения записей со многими элементами, которые вы хотите сгладить.

person miradulo    schedule 06.06.2016

Вы можете использовать следующую функцию и применить ее в цикле к каждому элементу в списке.

def flatten(data):
    if isinstance(data, tuple):
        if len(data) == 0:
            return ()
        else:
            return flatten(data[0]) + flatten(data[1:])
    else:
        return (data,)

Как это работает:

  • Сначала будет проверено, является ли тип кортежем, если нет, то кортеж аргумента
  • Вторая строка возвращает пустой кортеж, если кортеж пуст
  • Третья строка получает первый элемент и рекурсивно вызывает функцию

Самое приятное в этом решении:

  • Не обязательно знать структуру данного кортежа
  • Кортеж может быть вложен сколь угодно глубоко.
  • Работает в Python 2.2+ (и, возможно, раньше)

Код немного адаптирован из следующего источника:
https://mail.python.org/pipermail/tutor/2001-April/005025.html

Надеюсь, это поможет кому-то :)

person sagacity    schedule 08.11.2017

Улучшение по сравнению с ответом @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
person Muhammad Yasirroni    schedule 21.11.2020

Вы можете получить результат таким образом

>> example =  [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example] 
[(50, 2.738745180381648e-13, 219)]
person Sachin Sukumaran    schedule 16.03.2017

Совместимый с 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)]

Преимущество этого метода заключается в том, что вам не нужно искать имя переменной для каждого значения внутреннего кортежа, чтобы сгладить его, как в принятом ответе. Если есть два или три элемента, это не проблема, но представьте, что есть значения в десятых долях или больше...

person kriss    schedule 29.06.2017