Объединение 2 списков, таких как UNION, т.е. сохранение 1 копии взаимных позиций между 2 списками и добавление других

Я отредактировал его. Я сделал их списки для словарей. Если a и b – 2 словаря:

a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']} bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']} 

Я хочу объединить их

 {'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']} 

Я хочу объединить их, т.е.

 **How to do it in Python without overwwriting and replacing any value?** 

4 Solutions collect form web for “Объединение 2 списков, таких как UNION, т.е. сохранение 1 копии взаимных позиций между 2 списками и добавление других”

Рассмотрим использование другой структуры данных, такой как словарь наборов.

 a = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'],['http://www.michaeljackson.com']]] b = [['Australia', ['http://www.australia.com']], ['COM', ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']]] # convert these to dictionaries with set values a = {item[0]:set(s[0] for s in item[1:]) for item in a} b = {item[0]:set(s[0] for s in item[1:]) for item in b} # define a function to update our dictionary-of-sets data structure def union_update_setdict(D, *setdicts): """Update dictionary D (with `'key':set(value)` items) with items from setdicts. If a new key is added to D from setdicts, a shallow copy of the value is added to D. """ for setdict in setdicts: for k,v in setdict.items(): try: D[k].update(v) except KeyError: D[k] = v.copy() union_update_setdict(a, b) # Now let's test that the code works expected = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'], ['http://www.michaeljackson.com'], ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']], ['Australia', ['http://www.australia.com']]] # put the "expected" results in our new data structure for comparison expected = {item[0]:set(s[0] for s in item[1:]) for item in expected} print a assert expected == a 

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

 terribledatastruct = [[k]+[[item] for item in v] for k,v in a.items()] print terribledatastruct 

Я думаю, может быть, здесь может быть полезен defaultdict :

 from collections import defaultdict a = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'],['http://www.michaeljackson.com']]] b = [['Australia', ['http://www.australia.com']], ['COM', ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']]] d = defaultdict(list) d.update((v[0],v[1:]) for v in a) for v in b: country_or_com = v[0] urls = v[1:] d[country_or_com].extend(urls) 

Это не та структура данных, которую вы просите, но она довольно близка (и я думаю, предпочтительнее).

Если вы действительно хотите его в формате, который у вас есть (хотя в другом порядке):

 c = [] for k,v in d.items(): out = [k] out.extend(v) c.append(out) 

результаты:

 [['Australia', ['http://www.australia.com']], ['COM', ['http://www.uk.com'], ['http://www.michaeljackson.com'],['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']], ['UK', ['http://www.uk.com']]] 

По желанию.

если ваши списки – словари, вам просто нужно объединить словари:

 >>> a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']} >>> bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']} >>> dict(a.items()+bb.items()) {'Australia': 'http://www.australia.com', 'COM': ['http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': 'http://www.uk.com'} 

Обновить

мой ответ до сих пор делает это:

 >>> sk = list(set(bb.keys()+a.keys())) >>> sk ['Australia', 'COM', 'UK'] >>> nd {} >>> for i in sk: ... if i in a.keys(): ... nd[i]=a[i] ... >>> nd {'COM': ['http://www.uk.com', 'http://www.michaeljackson.com'], 'UK': 'http://www.uk.com'} >>> for i in sk: ... if i in bb.keys(): ... nd[i]=bb[i] ... >>> nd {'Australia': 'http://www.australia.com', 'COM': ['http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': 'http://www.uk.com'} 

Я подозреваю, что все равно нужно использовать словари, вот не очень эффективный способ работы cpu:

 a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']} bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']} sk = list(set(bb.keys()+a.keys())) nd = {} for i in sk: plholder=[] if i in a.keys(): print i print isinstance(a[i], str) if isinstance(a[i], str): plholder.append(a[i]) else: if i in a.keys(): for v in a[i]: plholder.append(v) if i in bb.keys(): if isinstance(bb[i], str): plholder.append(bb[i]) else: if i in a.keys(): for v in bb[i]: plholder.append(v) nd[i]=plholder print nd {'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']} 

* non cpu эффективен, потому что для больших наборов данных приложение будет очень медленным.

Странные структуры данных часто подходят для какой-то странной дьявольской библиотеки, скрывающейся ниже. Я бы предложил, для очевидности, преобразовать это в правильные структуры данных, работать с ними, а затем преобразовать его обратно. Вы избегаете проблем с реализацией ручного триггера в вашей странной структуре и т. Д.

Во-первых, сделайте данные приличными:

 a_ = { x[0]: set(e[0] for e in x[1:]) for x in a } b_ = { x[0]: set(e[0] for e in x[1:]) for x in b } 

Затем работайте с ним:

 c_ = defaultdict(set) for k, v in a_.iteritems(): c_[k] |= v for k, v in b_.iteritems(): c_[k] |= v 

Затем преобразуйте его в свою странную структуру:

 return [[k] + [[e] for e in v] for k, v in c_.iteritems()] 

Таким образом, я думаю, что действительно сделано ясно.

Предположения: Я предполагаю (1), что порядок сортировки не важен, и (2) значения появляются только один раз. Если это не так, сообщите об этом. Ваш вопрос был настолько коротким, что мне пришлось сделать некоторую интерпретацию.

для людей, которые не знакомы с sets уникальных коротких сокращений: c_[k] |= v, могут быть записаны как:
c_[k] = c_[k].union(v) .

см. наборы

  • сгладить список списков через понимание списка
  • Как сгладить список кортежей в список pythonic
  • поместите 0 перед номерами в списке, если они меньше десяти (в python)
  • Создайте список кортежей из двух вложенных списков
  • Средний -Питон
  • Как я перечисляю () над списком кортежей в Python?
  • Создание списка из списка списков в Python
  • Python: происходит нежелательное изменение переменной
  • Python - лучший язык программирования в мире.