2014-02-21 40 views
0

我有像這樣兩個列表生成詞典:使用兩個列表

listA = [a, b, c, d, e, f, g] 
listB = [g, h, i, j, k, l] 

我有以下功能

def genOneDic(dic1, dic2): 

我想這樣做返回的接單DIC像

dict((e, dic1.get(e)) for e in listA) + dict((e, dic2.get(e)) for e in listB) 

這似乎是錯誤的,什麼是正確的方法來做到這一點?

與DIC1例

dic1 = {'a':'1', 'b':'2', 'c':'3', 'd':'4', 'e':'5', 'f':'6', 'x':'10', 'z':'11'} 
listA = ['a', 'b', 'c', 'd', 'e', 'f'] 
dict((e, dic1.get(e)) for e in listA) 

應該得到的回報僅在listA的領域。現在,當加入listA和listB都有'g'時,但它們在單個詞典中應該是不同的。應該有兩個'克'。最好的解決方案是預先將dic1還是dic2加入到鍵中,然後加入dic?

+1

是期望結果:'{a:g,b:h,c:i,...}'? – ericmjl

+4

你能告訴我們你想創建的字典嗎? – mhlester

+0

你在找'dic1.update(dic2)'? – mhlester

回答

1

下面介紹如何創建一個在兩個列表中跳過重疊鍵的字典。

使用set intersection找到鑰匙在兩個列表:

listA = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
listB = ['g', 'h', 'i', 'j', 'k', 'l'] 

di={k:v for v,k in enumerate(listA,1) if k not in set(listA) & set(listB)} 
i=max(di.values()) 
di.update({k:v for v,k in enumerate(listB,i) if k not in set(listA) & set(listB)}) 
i=max(di.values()) 

print di 
# {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'f': 6, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'l': 11} 

然後再用交集創建重疊鍵的兩個鍵。在這一步,你可能會失去一些按鍵的順序重疊,因爲集合是無序的:

for e in set(listA) & set(listB): 
    di['listA.'+e]=max(di.values())+1 
    di['listB.'+e]=max(di.values())+1 

print di 
# {'a': 1, 'listB.g': 13, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'f': 6, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'l': 11, 'listA.g': 12} 

您可以使用相同的技術來交錯兩個列表和類型的字典:

listA = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
listB = ['g', 'h', 'i', 'j', 'k', 'l'] 
dic1 = {'a':'1', 'b':'2', 'c':'3', 'd':'4', 'e':'5', 'f':'6', 'g':'10', 'z':'11'} 
dic2 = {'g':'55', 'h':'56', 'i':'56', 'j':'57', 'k':'58', 'l':'59', 'x':'10', 'z':'11'} 

di={k:dic1.get(k, None) for k in listA if k not in set(listA) & set(listB)} 
di.update({k:dic2.get(k, None) for k in listB if k in set(listB)-set(listA) and k not in set(listA) & set(listB)}) 

for e in set(listA) & set(listB): 
    di['dic1.'+e]=dic1.get(e, None) 
    di['dic2.'+e]=dic2.get(e, None) 

print di 
# {'a': '1', 'c': '3', 'b': '2', 'e': '5', 'd': '4', 
    'f': '6', 'i': '56', 'h': '56', 'k': '58', 'j': '57', 
    'l': '59', 'dic1.g': '10', 'dic2.g': '55'} 
1

您的問題含糊不清,但我認爲這就是您要找的。

first = {k: dic1.get(k) for k in listA } 
second = {k: dic2.get(k) for k in listB } 
first.update(second)