2016-10-20 6 views
3

У меня есть два списка в Python:Объединить два списка вместе

L1=[[100, 1], [101, 2]] 
L2=[[100, 3], [101, 4], [102, 5]] 

, и я хочу, чтобы объединить их, так что я получаю:

L_merge=[[100, 4], [101, 6], [102, 5]] 

Важно, чтобы эти два списка могут быть не из тот же размер.

Я пытался использовать словари, но не мог понять это. Я рад использовать numpy, pandas или любые другие инструменты, чтобы получить это слияние.

+0

Адаптация решения от т он ссылается выше: 'collections.Counter (dict (L1)) + collections.Counter (dict (L2))'. Вероятно, есть способ пропустить преобразование списков в 'dict's first. См. Http://stackoverflow.com/q/11290092/2301450 – vaultah

+0

Что вы знаете о двух списках? Они оба определенно отсортированы? Могут ли быть «промежутки» в середине, когда элемент находится в одном списке, но не в другом? Вы уверены, что каждый элемент представляет собой список из двух целых чисел? И так далее. –

+0

«дублированный» вопрос о объединении dicts, а не о списках – mkj

ответ

4

Вы можете использовать collections.Counter в обоих списках и просто сумма их:

from collections import Counter 

L1 = [[100, 1], [101, 2]] 
L2 = [[100, 3], [101, 4], [102, 5]] 

L_merge = (Counter(dict(L1)) + Counter(dict(L2))).items() 
print(list(L_merge)) 
# [(100, 4), (101, 6), (102, 5)] 
+0

. Это отлично работает, просто быстро отслеживает: почему 'list (L_merge)' производит tupples, а не списки в любом случае избегайте этого (просто из любопытства). – valenzio

+0

@valenzio Метод 'items' словаря создает список кортежей. Вы можете использовать понимание списка, чтобы перечислить кортежи в списки. –

0

почему бы не просто использовать цикл:

L_merge = L2 
for i in len(L1): 
    L_merge[i][-1] += L1[i][-1] 

Одно предостережение в том, что это работает только, если L2 является больше из 2-х списков

+0

Да, это работает, я думаю, вы могли заранее проверить, какой из списков длиннее, но он выглядит довольно громоздким. – valenzio

0
L1=[[100, 1], [101, 2]] 
L2=[[100, 3], [101, 4], [102, 5]] 

d = {} 
for a,b in L1+L2: 
    d[a] = d.get(a,0) + b 
L_merge = [[k,v] for k,v in d.items()] 

print(L_merge) 
Смежные вопросы