设置
我有一本包含地区和邮政编码的字典,例如
d={
'Center':['A1', 'B1','C1', 'D1'],
'West':['A1', 'B2','C2', 'D2'],
⋮
'North':['A1', 'B2','C3', 'D3'],
}
问题
一些邮政编码在多个地区,例如A1
位于Center
,West
和North
,B2
位于West
和 北
。
我想检查多个地区的邮政编码,然后用这些邮政编码和地区创建一个“反之亦然”的字典,即
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
有两个问题:
- 如何迭代其他键,例如如果
key='Center'
那么如何遍历~key='West'
和~key='North'
。 - 如何将所有键分配给
vice_versa
,例如如何将'Center'
、'North'
和'West'
分配给vice_versa['A1']
。
为清楚起见,vice_versa
应仅包含“重复”的邮政编码,例如A1
和 B2
,不是示例中的其他邮政编码(例如不是 C1
)。
最佳答案
根据您在此处描述的内容,您需要对字典进行一些转置。在我看来,您最好为此使用 defaultdict
(它是 dict
的子类,因此仍支持所有字典操作):
<b>from collections import defaultdict</b>
vice_versa = <b>defaultdict(list)</b>
for region,postals in d.items():
for postal in postals:
vice_versa[postal].append(region)
在第二阶段,我们可以过滤掉只有一个区域的邮政,例如通过使用字典理解并将结果转回vanilla字典:
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']}
关于python:检查重复值上的字典键并分配给新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43367831/