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

标签 python dictionary key iteration

设置

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

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


问题

一些邮政编码在多个地区,例如A1 位于CenterWestNorthB2 位于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

有两个问题:

  1. 如何迭代其他键,例如如果 key='Center' 那么如何遍历 ~key='West'~key='North'
  2. 如何将所有键分配给 vice_versa,例如如何将 'Center''North''West' 分配给 vice_versa['A1']

为清楚起见,vice_versa 应仅包含“重复”的邮政编码,例如A1B2不是示例中的其他邮政编码(例如不是 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/

相关文章:

python - 在 scikit learn KNeighborsClassifier 中使用余弦距离

dictionary - Go 中的索引表达式是否根据上下文更改其返回类型?

python - 在 Python 3.6+ 中按值对字典排序

perl - 如何确定 Perl 哈希是否包含到未定义值的键映射?

php - 如何在 PHP 中重新索引数组的值?

python - 切片 dask 数组中的 n 个单独元素

python - 通过列表引用类实例

python - 什么是构建和安装?

ios - 使用地址字符串/地理编码在 map 上的两个注释引脚之间画线。 - objective-c

syntax - jq 嵌套键中的特殊字符