2017-02-05 2 views
0

Я пытаюсь создать код, который объединит 3 словаря разницы (два других словаря в первый основной словарь.), Когда есть дубликаты ключей при сохранении значений. Я в настоящее время застрял в точке, где я нахожу дубликаты, и мне сложно добавить их в newDict или d1. Может ли кто-нибудь помочь мне, чтобы каждый дубликат стал somekind объекта, где я могу передать его для добавления в новый словарь, содержащий все остальные ключи? Спасибо.Слияние словарей с дубликатами в python

d1 = {'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia':'510-669-7723'} 
# Phone number information/"newDict" 
d2 = {'Norton': '12345 El Monte Road', 'James': '4236 Capitol Expressway', 'Mary': '6345 Mia Circle'} 
# Address information 
d3 = {'Norton': 'Male', 'James': 'Male', 'John': 'Male', 'Elizabeth': 'Female'} 
# Gender Information 
newDict = d1 
# d1 will act as the main dictionary and retain all of it's entries and receive entries. 

newDictKeys=newDict.keys() 
d1Keys=d1.keys() 
d2Keys=d2.keys() 
d3Keys=d3.keys() 

allKeys = [d2Keys, d3Keys] # Left out d1Keys since it will retain it's entries. 
print('Printing original dictionary entries...','\n','d1 =', d1, '\n', 'd2 =', d2, '\n', 'd3 =', d3, '\n') 

print('Cross referencing keys from d1 with d2Keys and d3Keys...') 

tempList = [] 

def addToDictForSameKey(comboDictionary, addOnDictionary, key): 
    return None 


for keysOfDictX in allKeys: 
    for keyX in keysOfDictX: 
     print('\nChecking key:', keyX) 

     for keyY in newDict: 
      print('With this key in newDict:', keyY) 

      if keyX == keyY: # check for identical keys 
       addToDictForSameKey(newDict, d2, keyX) 
       print('Found Duplicate', keyX, 'with', keyY, 'in', keysOfDictX) 
       print('adding to newDict') 
       break 
      else: 

       continue 

print('\n', newDict) 

Выход:

Printing original dictionary entries... 
d1 = {'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia': '510-669-7723'} 
d2 = {'Norton': '12345 El Monte Road', 'James': '4236 Capitol Expressway', 'Mary': '6345 Mia Circle'} 
d3 = {'Norton': 'Male', 'James': 'Male', 'John': 'Male', 'Elizabeth': 'Female'} 

Cross referencing keys from d1 with d2Keys and d3Keys... 

Checking key: Norton 
With this key in newDict: Norton 
Found Duplicate Norton with Norton in dict_keys(['Norton', 'James', 'Mary']) 
adding to newDict 

Checking key: James 
With this key in newDict: Norton 
With this key in newDict: Edward 
With this key in newDict: Julia 

Checking key: Mary 
With this key in newDict: Norton 
With this key in newDict: Edward 
With this key in newDict: Julia 

Checking key: Norton 
With this key in newDict: Norton 
Found Duplicate Norton with Norton in dict_keys(['Norton', 'James', 'John', 'Elizabeth']) 
adding to newDict 

Checking key: James 
With this key in newDict: Norton 
With this key in newDict: Edward 
With this key in newDict: Julia 

Checking key: John 
With this key in newDict: Norton 
With this key in newDict: Edward 
With this key in newDict: Julia 

Checking key: Elizabeth 
With this key in newDict: Norton 
With this key in newDict: Edward 
With this key in newDict: Julia 

{'Norton': '408-771-7231', 'Edward': '415-669-7234', 'Julia': '510-669-7723'} 

Process finished with exit code 0 

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

{['Norton': '408-771-7231', '12345 El Monte Road', 'Male'] ['Edward': '415-669-7234'] ['Julia': '510-669-7723'] 
['James': '4325 Capitol Expressway', 'Male'] ['Mary': '6345 Mia Circle'] ['John': 'Male'] ['Elizabeth':'Female']} 

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

+0

Что бы вы хотели выход выглядеть? Приведите пример с * Norton * –

+0

обновленный желаемый результат – Burntrees4201

ответ

0

Если у вас есть дубликаты, то, вероятно, лучше сделать их все list с атрибутами, поэтому вам не нужно делать условные обозначения при доступе.

Однако, если вы хотите, условный список на дублирование, то просто построить list на дублировании:

def addToDictForSameKey(comboDictionary, addOnDictionary, key): 
    try: # Already a list 
     comboDictionary[key].append(addOnDictionary[key]) 
    except AttributeError: 
     comboDictionary[key] = [comboDictionary[key], addOnDictionary[key]] 

for d in (d2, d3): 
    for k, v in d.items(): 
     if k in d1: 
      addToDictForSameKey(d1, d, k): 

создать бы супер Dict всех трех dicts с повторяющимися ключами превращаются в list с атрибутов.

+0

Это для класса python для начинающих, поэтому я должен следовать этому методу использования циклов и словарей. – Burntrees4201

+0

Решение, которое вы дали мне, выводит несколько строк самого словарного дизайна, хотя последняя строка на выходе - это ответ, который я ищу. Как я опишу свой код, который я уже написал? Я думаю, что часть задания заключалась не в том, чтобы использовать ярлыки, хотя это кажется утомительным. – Burntrees4201

+0

Не удалось заставить его работать – Burntrees4201

0

Мое решение было это:

d0 = {} 

for key in set(d1.keys() + d2.keys() + d3.keys()): 
    try: 
     d0.setdefault(key,[]).append(d1[key]) 
    except KeyError: 
     pass 

    try: 
     d0.setdefault(key,[]).append(d2[key]) 
    except KeyError: 
     pass 

    try: 
     d0.setdefault(key,[]).append(d3[key]) 
    except KeyError: 
     pass 

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