【问题标题】:python: check dict keys on duplicate value and assign to new dictpython:检查重复值上的dict键并分配给新的dict
【发布时间】:2017-09-08 03:12:26
【问题描述】:

设置

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

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']
}


(半)到目前为止的代码
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 应仅包含“重复”邮政编码,例如A1B2not 示例中的其他邮政编码(例如,not C1)。

【问题讨论】:

  • 您是否也想在单个区域中包含邮政编码?
  • @WillemVanOnsem,说得好。不,我不想那样。只有“重复”的邮政编码。我会把它添加到问题中。

标签: python dictionary key iteration


【解决方案1】:

根据您在此处的描述,您需要字典的一些转置。在我看来,您最好为此使用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)

在第二阶段,我们可以过滤掉只有一个区域的邮件,例如使用 dictionary comprehension 并将结果转换回 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']}

【讨论】:

  • 天才!奇迹般有效。当我被允许时,我会接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多