【问题标题】:How do I rename a key while preserving order in dictionaries (Python 3.7+)?如何在保留字典顺序的同时重命名键(Python 3.7+)?
【发布时间】:2019-12-05 13:15:39
【问题描述】:

我有一本字典,有这个值:

{"a": 1, "b": 2, "c": 3}

我想将键 b 重命名为 B,而不会失去它的第二位。在Python 3.7 和更高版本中,字典保留了插入顺序,因此可以依赖键的顺序并且可能意味着什么。我正在寻找的最终结果是:

{"a": 1, "B": 2, "c": 3}

明显的代码是运行:

>>> dictionary["B"] = dictionary.pop("b")
{'a': 1, 'c': 3, 'B': 2}

但是,这并不能按预期保留顺序。

【问题讨论】:

  • 所以要修改同一个字典?
  • @RaySteam 是的,最好。
  • 这能回答你的问题吗? change key in OrderedDict without losing order
  • @RiccardoBucco 它确实回答了OrderedDict 部分,但不是dict 部分。我想我可以编辑我的问题以排除 OrderedDict 部分。
  • dicts 现在保留插入顺序,但如果您想在特定索引处插入/删除,它们仍然不是数据结构的好选择。因此,要么选择不同的数据结构,要么接受 O(n) 解决方案,例如重新构建整个字典

标签: python python-3.x


【解决方案1】:

此解决方案会就地修改字典 d。如果性能不是问题,您可以执行以下操作:

d = {"a": 1, "b": 2, "c": 3, "d": 4}
replacement = {"b": "B"}

for k, v in list(d.items()):
    d[replacement.get(k, k)] = d.pop(k)

print(d)

输出:

{'a': 1, 'B': 2, 'c': 3, 'd': 4}

请注意,上述解决方案适用于要替换的任意数量的键。另请注意,您需要遍历 d.items() 的副本(使用 list(d.items())),因为您不应在修改其键时遍历字典。

【讨论】:

  • 这个解决方案有问题。在d.items() 的循环内更改d 可能会导致RuntimeError。要重现此类错误,请在第一行的字典中添加一个项目"d": 4,您将得到一个。
  • @wklchris 您所说的错误已通过循环list(d.items()) 修复,请参阅编辑。
【解决方案2】:
foo = {'c': 2, 'b': 4, 'J': 7}
foo = {key if key != 'b' else 'B': value for key, value in foo.items()}
foo
Out[7]: {'c': 2, 'B': 4, 'J': 7}

【讨论】:

  • 这会创建一个新字典,它不会修改现有的字典。
【解决方案3】:
dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = dict()

for key in dict1:
    if key == 'b':
        dict2[key.upper()] = dict1[key]
    else:
        dict2[key] = dict1[key]

dict1 = dict2 #if you want to have it in original dict

你可以在 if 语句中设置任何你想要的值

【讨论】:

  • 这会创建一个新字典,它不会修改现有的字典
【解决方案4】:

作为现有答案的一种变体,它也适用于多次替换,您可以定义另一个字典,显示用其他键替换哪些键:

>>> d = {"a": 1, "b": 2, "c": 3}
>>> repl = {"b": "B"}
>>> {repl.get(k, k): d[k] for k in d}
{'a': 1, 'B': 2, 'c': 3}

当然,这仍然会创建一个新字典而不是更新现有字典,因此需要 O(n),但至少对于所有需要更新的键,它只这样做一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2018-02-12
    • 2021-06-26
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多