2016-02-19 4 views
4

У меня есть два списка списков, имеющих эквивалентное количество элементов. Два списка выглядит следующим образом:Слияние списков списков

L1 = [[1, 2], [3, 4], [5, 6, 7]]

L2 =[[a, b], [c, d], [e, f, g]]

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

Lmerge = [[[a, 1], [b,2]], [[c,3], [d,4]], [[e,5], [f,6], [g,7]]]

Я пытался использовать map():

map(list.__add__, L1, L2), но outpu t производит плоский список.

Каков наилучший способ объединения двух списков списков? Заранее спасибо.

ответ

7

Вы можете zip списки, а затем zip результирующие кортежи снова ...

>>> L1 = [[1, 2], [3, 4], [5, 6, 7]] 
>>> L2 =[['a', 'b'], ['c', 'd'], ['e', 'f', 'g']] 
>>> [list(zip(a,b)) for a,b in zip(L2, L1)] 
[[('a', 1), ('b', 2)], [('c', 3), ('d', 4)], [('e', 5), ('f', 6), ('g', 7)]] 

Если вам нужно-списки весь путь вниз, в сочетании с `карте:

>>> [list(map(list, zip(a,b))) for a,b in zip(L2, L1)] 
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]] 
3

Вы были на правильный трек с map.

Вот короче альтернатива первой версии, tobias_k, zip вместе соответствующие элементы из обоих списков:

>>> zipped = map(zip, L2, L1) 
>>> list(map(list, zipped)) # evaluate to a list of lists 
[[('a', 1), ('b', 2)], [('c', 3), ('d', 4)], [('e', 5), ('f', 6), ('g', 7)]] 

Как было отмечено в комментариях, в Python 2, краткий map(zip, L2, L1) достаточно.

map(zip, L2, L1) будет работать и для вас в Python 3, учитывая, что вы перебираете его только один раз и вам не нужен доступ к последовательностям по индексу. И если вам нужно многократно повторять, вас может заинтересовать itertools.tee.

Более короткая альтернатива второй версии:

>>> [list(map(list, x)) for x in map(zip, L2, L1)] 
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]] 

Наконец, есть и это:

>>> from functools import partial 
>>> map(partial(map, list), map(zip, L2, L1)) 
[[['a', 1], ['b', 2]], [['c', 3], ['d', 4]], [['e', 5], ['f', 6], ['g', 7]]] 
+1

Ницца. На самом деле, в Python 2 первая эквивалентна просто «map (zip, L2, L1)»), но вам, вероятно, потребуется как минимум столько символов, чтобы объяснить, что это делает. ;-) –

+0

@tobias_k: Спасибо, что указали это. Я предположил, что мы говорим о Python 3 и что OP действительно нужен список. Но для других людей самая короткая версия может быть подходящей, даже если они отбросили Python 2. Возможно, она может быть самой читаемой, по крайней мере, для людей, знакомых с «map» и «zip». – arekolek

Смежные вопросы