Zip / Map Списки списков в Python - PullRequest
3 голосов
/ 01 марта 2012

У меня есть списки вроде:

L1 = [list]

L2 = [ [l1], [l2], ..., [ln] ]

Мне нужно сопоставить эти списки с

L = [ [list+l1] , [list + l2] , ..., [list + ln] ]

Прямо сейчас я просто повторяю L1 n раз, а затем застегиваю их. Может кто-нибудь подсказать мне более элегантный способ? Другими словами, я хочу сделать это:

L=[]
L.append(L1 + L2[0])
L.append(L1 + L2[1])
...

Было бы также хорошо, если бы решение было устойчивым к следующему изменению:

L1 = [list1, list2, ..., listk]

и тогда L становится

[ [list1 + list2 + ... + listk + l1] , ..., [list1 + list2 + ... + listk + ln] ]

Спасибо!

Ответы [ 2 ]

4 голосов
/ 01 марта 2012
L=[]
L.append(L1 + L2[0])
L.append(L1 + L2[1])
...

эквивалентно

L = [ L1+item for item in L2 ]

Если L1 = [list1, list2, ..., listk] представляет собой список списков, например

In [43]: L1 = [[1,2],[2,3]]

, то list1 + list2 + ... + listk можно сформировать с помощьюsum(L1, []):

In [44]: sum(L1,[])
Out[44]: [1, 2, 2, 3]

In [45]: [1,2]+[2,3]
Out[45]: [1, 2, 2, 3]

Таким образом, в этом случае вы можете использовать

L1_sum = sum(L1, [])
L = [ L1_sum+item for item in L2 ]

(В стороне: также можно использовать L = [ sum(L1, [])+item for item in L2 ], но это повторит вычисление sum(L1, []) один раз за каждый элемент в L2.)

2 голосов
/ 01 марта 2012

Использование списочных представлений является питоническим способом:

L = [ L1 + list for list in L2 ]
...