【问题标题】:Match two dictionaries by key and return array of values通过键匹配两个字典并返回值数组
【发布时间】:2015-03-06 11:33:49
【问题描述】:

我有两个要按键匹配的字典,以便创建一个新字典,其中 dict1 中的每个值都作为键,并将 dict2 中每个匹配键的值的列表作为输出中的值。该示例应该不那么令人困惑:

dict1 = {'AAA': 'id5', 'BBB': 'id3', 'CCC': 'id8', 'DDD': 'id3'}
dict2 = {'AAA': 'value8', 'BBB': 'value24', 'CCC': 'value13', 'DDD': 'value2'}

我尝试过的:

keys = set(dict1) & set(dict2)
complete = {}
for x in keys:
    key = dict1[x]
    value = dict2[x]
    complete[key] = [value]

输出:

complete = {'id3': ['value24'], 'id5': ['value8'], 'id8': ['value13']}

期望的输出:

complete = {'id3': ['value24', 'value2'], 'id5': ['value8'], 'id8': ['value13']}

实际上,字典非常大,因此性能是一个重要因素。任何帮助表示赞赏。

【问题讨论】:

  • 为什么'id3'不是唯一的?
  • @PadraicCunningham:这就是重点;一开始我也误解了,但是来自dict1values 是输出中的 keys,与另一个字典中的值配对。
  • @MartijnPieters。是的,但是id3 出现了两次,所以键应该是 id5id8 通过 创建一个新字典,其中 dict1 中的每个唯一值作为键
  • 应该使用一个重复实例。我只是不想以多个 'id3' 结束。
  • @PadraicCunningham:啊,是的,措辞选择不当。这些值不是唯一的。不过意图很明确。每个值都应该创建一个唯一的键,重复项折叠成一个值列表。

标签: python python-3.x


【解决方案1】:

dict.keys() method 返回一个已经作为集合的dictionary view。您需要做的就是将这些观点结合起来。

如果您来自 dict1 的值不是唯一的,请使用 dict.setdefault() 构建值列表:

output = {}
for key in dict1.keys() & dict2.keys():
    output.setdefault(dict1[key], []).append(dict2[key])

演示:

>>> dict1 = {'AAA': 'id5', 'BBB': 'id3', 'CCC': 'id8', 'DDD': 'id3'}
>>> dict2 = {'AAA': 'value8', 'BBB': 'value24', 'CCC': 'value13', 'DDD': 'value2'}
>>> output = {}
>>> for key in dict1.keys() & dict2.keys():
...     output.setdefault(dict1[key], []).append(dict2[key])
... 
>>> output
{'id8': ['value13'], 'id3': ['value24', 'value2'], 'id5': ['value8']}

这几乎是最有效的。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-01-10
    • 1970-01-01
    • 2020-12-03
    • 2021-11-21
    相关资源
    最近更新 更多