2012-06-20 2 views
18

Possible Duplicate:
Merging/adding lists in Pythonперемежения Списки в Python

У меня есть два списка:
[a, b, c] [d, e, f]
Я хочу:
[a, d, b, e, c, f]

Что простой способ сделать это в Python?

+1

В этом конкретном порядке? Или просто добавлены друг к другу? Полученный вами список не работает. Если они вам нужны в этом порядке, каково правило, определяющее этот порядок? –

+6

@ dusan: Совсем не такой вопрос. –

+0

Подождите, почему это не дубликат? – eboix

ответ

26

Один из вариантов:

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)) 
+4

+1. Наверное, лучшее решение. Но, возможно, стоит объяснить, почему это работает: zipping дает [(a, d), (b, e), (c, f)], а затем цепочка сглаживает это на [a, d, b, e, c, f ]. (Поощрять людей изучать itertools всегда хорошо.) – abarnert

+2

Будет ли это играть хорошо, если списки не равны или, по крайней мере, +/- 1, длина? –

+1

@ sr2222: Хороший момент - он остановится в более коротком списке. –

2

Вы могли бы сделать что-то простое, используя встроенные функции :

sum(zip(list_a, list_b),()) 
+0

'TypeError: может только список конкатенаций (а не« tuple ») в список' – Makoto

+3

Это не лучший способ объединения нескольких списков. Он имеет сложность O (n²) и его следует избегать. –

+0

См. [Выполнение плоского списка из списка списков в Python] (http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python) для дополнительной информации. –

28

Вот довольно простой метод, используя список понимание:

>>> 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

+1, но, как и в случае с ответом Свена Марнаха, возможно, стоит объяснить, почему он работает: застегните списки, а затем сгладьте результат. Поскольку большинство новых пользователей не интуитивно поняли, что «[x for t in l for x in t]» означает «flatten l». – abarnert

+1

Возможно, только мое предпочтение, но этот ответ кажется мне менее сложным. –

4

Это один работает только в Python 2.x, но будет работать для списков разной длины:

[y for x in map(None,lis_a,lis_b) for y in x] 
Смежные вопросы