2017-04-12 35 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