【问题标题】:Replacing the value of a Python dictionary with the value of another dictionary that matches the other dictionaries key将 Python 字典的值替换为与其他字典键匹配的另一个字典的值
【发布时间】:2021-01-01 04:19:28
【问题描述】:

目前我有两本词典

dictionary1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
dictionary2 = {'value1': 'AAA', 'value3': 'CCC'}

我想用 dictionary2 中的值替换 dictionary1 的值,上面的示例将产生以下输出

{'key1': 'AAA', 'key2': 'value2', 'key3': 'CCC'}

从我读过的其他示例中,我认为我应该如下开始我的代码:

for key, value in dictionary1.iteritems():
    if value ==

现在我不确定循环浏览另一个字典以查找字典 1 中的值是否与字典 2 中的键匹配的最佳方法。

【问题讨论】:

  • 与实际问题无关,但我建议给您的字典起新名称 -- 如果我看到名称 list1,我可能会认为它是 list 而不是 dict ;-)
  • 谢谢 - 我改了

标签: python list dictionary


【解决方案1】:

你可以用字典理解来做到这一点,像这样

>>> dictionary1 = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
>>> dictionary2 = {'value1': 'AAA', 'value3': 'CCC'}
>>> {k: dictionary2.get(v, v) for k, v in dictionary1.items()}
{'key3': 'CCC', 'key2': 'value2', 'key1': 'AAA'}

这里,dict2.get(v, v) 会尝试从dict2 中获取值v 对应的值。如果没有找到,则返回默认值(第二个参数)v本身。

注意 1:您所讨论的内容称为字典,而不是列表。

注意 2:如果您使用的是 Python 2.7,那么您可能希望使用 dict1.iteritemsdict1.viewitems 而不是 dict1.items。原因在this answer中有详细解释,并附有示例。

【讨论】:

  • 这对我不起作用。我不知道为什么。应该,但不是。
  • 这应该是{k: dictionary2.get(k, v) for k, v in dictionary1.items()}。因为get方法接受key作为第一个参数
【解决方案2】:

如果不存在,则在第二个列表中进行交叉查找并回退到默认值是可行的方法。

>>> {key : list2.get(value, value) for key, value in list1.items()}
{'key3': 'CCC', 'key2': 'value2', 'key1': 'AAA'}

get(key[, default]) 允许您在字典中查找键,如果值不存在,则返回默认值。默认值应该与您在第二个字典中搜索的值相同。

【讨论】:

  • python这样做的方式。
【解决方案3】:

您基本上想对第二个字典进行第二次 for 循环,直到找到匹配的值。

for key, value in list1.iteritems():
    for key2 in list2:
         if value == key2:
             list1[key] = list2[key2]
             break

【讨论】:

  • 运行时间可以与 size(list1)*size(list2) 成正比,所以这不是一个好方法。
【解决方案4】:

对于原地更改:

for k,v in dictionary1.items():
    if v in dictionary2 : dictionary1[k]=dictionary2[v]

这比创建一个新的要快。

【讨论】:

    【解决方案5】:

    添加此解决方案以假装呈现具有更复杂条件的 dict 理解解决方案:

    我遇到过类似的情况,但目标是替换不同字典中的匹配键,其中字典对于每个键值对都有多个值。经过长时间的条件式dict理解尝试错误时间后,我的解决方案是:

    >>> result = {k: [dic2.get(v, v) for v in v] for k, v in dic1.iteritems()}
    

    图:

    >>> dic1 = {'key1': ['value1', 'value12', 'value13'], 'key2': ['value2', 'value21'] 'key3': ['value3']}
    >>> dic2 = {'value1': 'path_AA', 'value12': 'path_BB',  'value2': 'path_DD', 'value21': 'path_EE', 'value3': 'path_FF'}
    >>>
    >>> result = {'key1': ['path_AA', 'path_BB'], 'key2': ['path_DD', 'path_EE'], 'key3': 'path_FF'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2022-08-17
      • 2021-07-21
      • 1970-01-01
      • 2016-04-14
      • 2014-08-15
      • 2021-03-11
      相关资源
      最近更新 更多