Группировка двух списков в python

У меня есть два списка, которые я хочу сгруппировать по первому элементу списков.

list1 = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] list2 = [['1','rofl','pole'],['2','sole','pop'],['3','lmao','wtf']] 

Здесь первые элементы в списке внутри списка: «1», «2» и «3».

Я хочу, чтобы мой последний список был следующим:

 Final_List = [['1', 'abc', 'zef', 'rofl', 'pole'], ['3', 'lol', 'pop', 'lmao', 'wtf'], ['2', 'qwerty', 'opo', 'sole', 'pop']] 

Я пробовал это, используя код ниже.

 #!/usr/bin/python list1 = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] list2 = [['1','rofl','pole'],['2','sole','pop'],['3','lmao','wtf']] d = {} for i in list1: d[i[0]] = i[1:] for i in list2: d[i[0]].extend(i[1:]) Final_List = [] for key, value in d.iteritems(): value.insert(0,key) Final_List.append(value) 

Этот код работает, но мне было интересно, есть ли простой и понятный способ сделать это

Любая помощь?

Я бы написал, как вы написали с небольшой модификацией, как это

  1. Подготовьте словарь со всеми элементами из второй позиции, собранной в соответствии с первым элементом.

     d = {} for items in (list1, list2): for item in items: d.setdefault(item[0], [item[0]]).extend(item[1:]) 
  2. А потом просто получите все значения из словаря (спасибо @jamylak) 🙂

     print(d.values()) 

Вывод

 [['3', 'lol', 'pop', 'lmao', 'wtf'], ['1', 'abc', 'zef', 'rofl', 'pole'], ['2', 'qwerty', 'opo', 'sole', 'pop']] 

Если последовательность элементов в списках внутри Final_List не важна, это можно использовать,

 [list(set(sum(itm, []))) for itm in zip(list1, list2)] 

Ваш код кажется правильным. Просто измените следующую часть:

 Final_List = [] for key in d: L = [key] + [x for x in d[key]] Final_List.append(L) 

Да, с пониманием списка и перечислением

 list1 = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] list2 = [['1','rofl','pole'],['2','sole','pop'],['3','lmao','wtf']] print [set(v + list2[k]) for k,v in enumerate(list1)] [['1', 'abc', 'zef', 'rofl', 'pole'], ['2', 'qwerty', 'opo', 'sole', 'pop'], ['3', 'lol', 'pop', 'lmao', 'wtf']] 

РЕДАКТИРОВАТЬ

С отношением индексов

 list1 = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] list2 = [['1','rofl','pole'],['3','lmao','wtf'],['2','sole','pop']] d1 = {a[0]:a for a in list1} d2 = {a[0]:a for a in list2} print [set(v + d2[k]) for k, v in d1.items()] 

Используя определения dict и списка по умолчанию, вы можете сократить свой код

 from collections import defaultdict list1 = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] list2 = [['1','rofl','pole'],['2','sole','pop'],['3','lmao','wtf']] d = defaultdict(list) for i in list1 + list2: d[i[0]].extend(i[1:]) Final_List = [[key] + value for key, value in d.iteritems()] print Final_List 
 list3 = [] for i in xrange(0,max(len(list1[0]), len(list2[0]))): list3.append(list(list1[i])) list3[i].extend(x for x in list2[i] if x not in list3[i]) 

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

Немного функционального стиля:

 import operator, itertools from pprint import pprint one = [['1','abc','zef'],['2','qwerty','opo'],['3','lol','pop']] two = [['1','rofl','pole'],['2','sole','pop'],['3','lmao','wtf']] 

Несколько помощников:

 zero = operator.itemgetter(0) all_but_the_first = operator.itemgetter(slice(1, None)) data = (one, two) def foo(group): # group is (key, iterator) from itertools.groupby key = group[0] lists = group[1] result = list(key) for item in lists: result.extend(all_but_the_first(item)) return result 

Функция обработки daa

 def process(data, func = foo): # concatenate all the sublists new = itertools.chain(*data) # group by item zero three = sorted(new, key = zero) groups = itertools.groupby(three, zero) # iterator that builds the new lists return itertools.imap(foo, groups) 

Применение

 >>> pprint(list(process(data))) [['1', 'abc', 'zef', 'rofl', 'pole'], ['2', 'qwerty', 'opo', 'sole', 'pop'], ['3', 'lol', 'pop', 'lmao', 'wtf']] >>> >>> for thing in process(data): print thing ['1', 'abc', 'zef', 'rofl', 'pole'] ['2', 'qwerty', 'opo', 'sole', 'pop'] ['3', 'lol', 'pop', 'lmao', 'wtf'] >>> 

list1 = [['1', 'abc', 'zef'], ['2', 'qwerty', 'opo'], ['3', 'lol', 'pop']]

list2 = [['1', 'rofl', 'pole'], ['2', 'sole', 'pop'], ['3', 'lmao', 'wtf']]

Final_List = []

для i в диапазоне (0, len (list1)):

  Final_List.append(list1[i] + list2[i]) del Final_List[i][3] 

print Final_List

Вывод

[['1', 'abc', 'zef', 'rofl', 'pole'], ['2', 'qwerty', 'opo', 'sole', 'pop'], ['3', ' 'lol', 'pop', 'lmao', 'wtf']]