【问题标题】:Python dictionary replace valuesPython字典替换值
【发布时间】:2023-10-22 19:25:02
【问题描述】:

我有一本包含 20 000 多个条目的字典,目前只有唯一的单词和该单词在源文本中使用的次数(但丁的意大利神曲)。

我想处理所有条目,用我找到的实际定义替换值。是否有一种简单的方法来遍历具有数字值的关键字以进行替换(正如我研究的含义)?

字典开始:

{'corse': 378, 'cielo,': 209, 'mute;': 16, 'torre,': 11, 'corsa': 53, 'assessin': 21, 'corso': 417, 'Tolomea': 21}  # etc.

一种应用程序,会建议一个关键字进行研究和定义。

【问题讨论】:

  • 我最终打包了一本新字典。它有效,但它确实效率低下。 dict 感觉一团糟。

标签: python python-3.x dictionary


【解决方案1】:

您无法选择特定值(或值类型)。您要么创建一个反向索引(将数字映射回(列表)键),要么每次都必须遍历 all 值。

如果你以任意顺序处理数字,你也可以遍历所有项目:

for key, value in inputdict.items():
    # do something with value
    inputdict[key] = newvalue

否则我会使用反向索引:

from collections import defaultdict

reverse = defaultdict(list)
for key, value in inputdict.items():
    reverse[value].append(key)

现在您可以按值查找键:

for key in reverse[value]:
    inputdict[key] = newvalue

【讨论】:

  • 在 Python 2 中,如果迭代大型字典,请使用 iteritems() 而不是 items(),以便整个字典内容不会加载到内存中。 (这对于 Python 3 无关紧要,因为 items() 基本上做了 iteritems() 在 Python 2 中所做的事情。)
  • @nofinator:在 Python 2 中,您使用 iteritems() 来防止创建新的列表列表,其中 len(dictionary) 元组引用字典中的键值对(仅迭代)。字典内容本身总是加载到内存中。这并不适用于此,因为问题被标记为 Python 3 :-)
  • @MartijnPieters 我们可以使用相同的设置以某种方式检索旧值吗?就像.update() 返回旧值一样,它会为我节省一个保存旧值然后替换的步骤,以防我想这样做
  • @VivekKalyanarangan:不知道你在问什么;这里的问题是找到给定值的键,然后使用该键替换其他地方的内容。我想您是在问是否可以获取给定键的旧值,同时输入新值?没有,只用两个语句:old = d.get(key),如果丢失的键不是错误,则使用old = d[key],否则使用d[key] = new
【解决方案2】:

通过 dict.update() 函数

如果您需要声明式解决方案,您可以使用dict.update() 更改字典中的值。

像这样:

my_dict.update({'key1': 'value1', 'key2': 'value2'})

或者像这样:

my_dict.update(key1='value1', key2='value2')

通过字典解包

Python 3.5 开始,您还可以为此使用字典解包

my_dict = { **my_dict, 'key1': 'value1', 'key2': 'value2'}

注意:这会创建一个新字典。

通过合并运算符或更新运算符

Python 3.9 开始,您还可以在字典上使用 合并运算符

my_dict = my_dict | {'key1': 'value1', 'key2': 'value2'}

注意:这会创建一个新字典。

或者你可以使用更新操作符

my_dict |= {'key1': 'value1', 'key2': 'value2'}

【讨论】:

    【解决方案3】:

    如果您遍历字典,您将获得键,因此假设您的字典位于名为 data 的变量中,并且您有一些函数 find_definition() 可以获取定义,您可以执行以下操作:

    for word in data:
        data[word] = find_definition(word)
    

    【讨论】:

      【解决方案4】:

      我认为这可能会帮助您解决问题。

      想象一下你有一本这样的字典:

      dic0 = {0:"CL1", 1:"CL2", 2:"CL3"}
      

      你想通过这个来改变值:

      dic0to1 = {"CL1":"Unknown1", "CL2":"Unknown2", "CL3":"Unknown3"}
      

      您可以使用下面的代码将dic0 的值更改为dic0t01,而不必担心字典中的索引:

      for x, y in dic0.items():
          dic0[x] = dic0to1[y]
      

      现在你有:

      >>> dic0
      {0: 'Unknown1', 1: 'Unknown2', 2: 'Unknown3'}
      

      【讨论】:

        【解决方案5】:
        data = {key1: value1, key2: value2, key3: value3}
        
        for key in data:
           if key == key1:
               data[key1] = change
               print(data)
        

        这会将 key1: value1 替换为 key1: change

        【讨论】: