Как объединить произвольное количество кортежей в Python? - PullRequest
6 голосов
/ 22 февраля 2012

У меня есть список кортежей:

l=[(1,2,3),(4,5,6)]

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

f=[1,2,3,4,5,6] # or (1,2,3,4,5,6)

Если я знаю, сколько раз я вернусь во время разработки, я мог бы просто добавить их:

m = l[0] + l[1]  # (1,2,3,4,5,6)

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

Ответы [ 7 ]

16 голосов
/ 22 февраля 2012

Цепочка их (только создает генератор вместо резервирования дополнительной памяти):

>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain.from_iterable(l))
[1, 2, 3, 4, 5, 6]
9 голосов
/ 22 февраля 2012
l = [(1, 2), (3, 4), (5, 6)]
print sum(l, ()) # (1, 2, 3, 4, 5, 6)
2 голосов
/ 22 февраля 2012

Используйте стиль питонического генератора для всего следующего:

b=[(1,2,3),(4,5,6)]

list = [ x for x in i for i in b ] #produces a list
gen = ( x for x in i for i in b ) #produces a generator
tup = tuple( x for x in i for i in b ) #produces a tuple

print list
>> [1, 2, 3, 4, 5, 6]
2 голосов
/ 22 февраля 2012
tuple(i for x in l for i in x) # (1, 2, 3, 4, 5, 6)
2 голосов
/ 22 февраля 2012
reduce(tuple.__add__, [(1,2,3),(4,5,6)])
1 голос
/ 22 февраля 2012
>>> from itertools import chain
>>> l = [(1,2,3),(4,5,6)]
>>> list(chain(*l))
[1, 2, 3, 4, 5, 6]
0 голосов
/ 23 февраля 2012

Вы можете объединить значения в списке, используя функцию .extend() следующим образом:

l = [(1,2,3), (4,5,6)]
m = []
for t in l:
    m.extend(t)

или более короткая версия, использующая уменьшение:

l = [(1,2,3), (4,5,6)]
m = reduce(lambda x,y: x+list(y), l, [])
...