2017-04-12 92 views
3

建立蟒蛇:檢查重複的值字典鍵並指定新的字典

我有一個包含地區和郵政編碼,如字典

d={ 
'Center':['A1', 'B1','C1', 'D1'], 
'West':['A1', 'B2','C2', 'D2'], 
    ⋮ 
'North':['A1', 'B2','C3', 'D3'], 
} 


問題

某些郵編是在複合區,例如A1CenterWestNorthB2WestNorth

我要檢查其郵政編碼在多個區域,然後創建與這些郵政編碼和地區的一個「反之亦然」字典,即

vice_versa = { 
'A1':['Center', 'West', 'North'] 
    ⋮ 
'B2':['West', 'North'] 
} 


(SEMI)的代碼,到目前爲止,

vice_versa={} 
for key in list(d.keys()): 
    for x in d[key]: 
     if x in d[~key]: 
      vice_versa[x] = key, ~key 

這裏有兩個問題:

  1. 如何迭代其他鍵,例如如果key='Center'那麼如何迭代~key='West'~key='North'
  2. 如何將所有密鑰分配給vice_versa,例如,如何分配'Center','North''West'vice_versa['A1']

爲了清楚起見,vice_versa應該只包含'重複'的郵政編碼,例如, A1B2而不是該示例中的其他郵政編碼(例如不是C1)。

+0

您是否想要將郵政編碼包含在單個區域? –

+0

@WillemVanOnsem,好評。不,我不想那樣。只有'重複'的郵政編碼。我會將其添加到問題中。 – LucSpan

回答

3

根據你在這裏描述的內容,你想要一些轉置的字典。在我看來你更好的使用這個defaultdict(這是dict子類,所以所有的字典操作仍然支持):

from collections import defaultdict 

vice_versa = defaultdict(list) 
for region,postals in d.items(): 
    for postal in postals: 
     vice_versa[postal].append(region)

在第二階段,我們可以過濾掉postals只有一個區域,用於例如,通過使用字典解析並把結果返回到香草詞典:

vice_versa = {k:v for k,v in vice_versa.items() if len(v) > 1} 

根據您的樣品輸入,這給:

>>> {k:v for k,v in vice_versa.items() if len(v) > 1} 
{'B2': ['North', 'West'], 'A1': ['Center', 'North', 'West']} 
+2

天才!奇蹟般有效。當我被允許時,我會接受答案。 – LucSpan