python:检查重复值的dict键并分配给新的字典

时间:2017-04-12 11:06:11

标签: python dictionary key iteration

设置向上

我有一个包含地区和邮政编码的字典,例如

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

<小时/> 的问题

有些邮政编码位于多个地区,例如: A1位于CenterWestNorthB2位于WestNorth

我想检查哪些邮政编码在多个区域,然后创建一个反之亦然的&#39;这些邮政编码和地区的字典,即

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

<小时/> 到目前为止(半)代码

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']
  3. 为清楚起见,vice_versa应仅包含“重复”字样。邮政编码,例如A1B2以及示例中的其他邮政编码(例如,不是C1)。

1 个答案:

答案 0 :(得分: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)

在第二阶段,我们可以仅使用一个区域过滤出邮件,例如使用字典理解并将结果转换回 vanilla 字典:< / p>

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']}
相关问题