Possible Duplicate:
Merging/adding lists in Pythonперемежения Списки в Python
У меня есть два списка:
[a, b, c] [d, e, f]
Я хочу:
[a, d, b, e, c, f]
Что простой способ сделать это в Python?
Possible Duplicate:
Merging/adding lists in Pythonперемежения Списки в Python
У меня есть два списка:
[a, b, c] [d, e, f]
Я хочу:
[a, d, b, e, c, f]
Что простой способ сделать это в Python?
Один из вариантов:
from itertools import chain, izip
list(chain.from_iterable(izip(list_a, list_b)))
Редактировать: Как было отмечено sr2222 в комментариях, это не работает хорошо, если списки имеют разную длину. В этом случае, в зависимости от желаемых семантик, вы можете использовать (гораздо более общий) roundrobin()
функцию от recipe section в itertools
документации:
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
+1. Наверное, лучшее решение. Но, возможно, стоит объяснить, почему это работает: zipping дает [(a, d), (b, e), (c, f)], а затем цепочка сглаживает это на [a, d, b, e, c, f ]. (Поощрять людей изучать itertools всегда хорошо.) – abarnert
Будет ли это играть хорошо, если списки не равны или, по крайней мере, +/- 1, длина? –
@ sr2222: Хороший момент - он остановится в более коротком списке. –
Вы могли бы сделать что-то простое, используя встроенные функции :
sum(zip(list_a, list_b),())
'TypeError: может только список конкатенаций (а не« tuple ») в список' – Makoto
Это не лучший способ объединения нескольких списков. Он имеет сложность O (n²) и его следует избегать. –
См. [Выполнение плоского списка из списка списков в Python] (http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python) для дополнительной информации. –
Вот довольно простой метод, используя список понимание:
>>> lists = [['a', 'b', 'c'], ['d', 'e', 'f']]
>>> [x for t in zip(*lists) for x in t]
['a', 'd', 'b', 'e', 'c', 'f']
Или, если у вас списки в виде отдельных переменных (как и в других ответов):
[x for t in zip(list_a, list_b) for x in t]
+1, но, как и в случае с ответом Свена Марнаха, возможно, стоит объяснить, почему он работает: застегните списки, а затем сгладьте результат. Поскольку большинство новых пользователей не интуитивно поняли, что «[x for t in l for x in t]» означает «flatten l». – abarnert
Возможно, только мое предпочтение, но этот ответ кажется мне менее сложным. –
Это один работает только в Python 2.x, но будет работать для списков разной длины:
[y for x in map(None,lis_a,lis_b) for y in x]
В этом конкретном порядке? Или просто добавлены друг к другу? Полученный вами список не работает. Если они вам нужны в этом порядке, каково правило, определяющее этот порядок? –
@ dusan: Совсем не такой вопрос. –
Подождите, почему это не дубликат? – eboix