Python 将字符串添加到字典键

时间:2021-04-08 13:40:25

标签: python python-3.x dictionary

有没有办法在不创建新字典的情况下将字符串添加到字典中的所有键? 我尝试了几种方法,但出现以下错误:

    for key in result:
RuntimeError: dictionary keys changed during iteration

我的代码:

def get_temps_servers():
    result = dict(re.findall(r"^(.*?) {2,}.*?(\d+C|\d+Watts)", text, flags=re.M))
    name = "Test"
    for key in result:
        x = f"{name} {key}"
        result[x] = result[key]
        del result[key]
    print(result)
    return result

这是我原来的字典的样子:

result = {'CPU1 Temp': '35C', 'CPU2 Temp': '39C', 'System Board Inlet Temp': '18C', 'System Board Exhaust Temp': '29C', 'System Board Pwr Consumption': '130Watts'}

如果我创建一个从原始词典复制的新词典,效果很好,就像这样:

def get_temps_servers():
    result = dict(re.findall(r"^(.*?) {2,}.*?(\d+C|\d+Watts)", text, flags=re.M))
    name = "Test"
    res = {f"{name} {key}": val for key, val in result.items()}
    print(res)
    return res

这是结果:

res = {'Test CPU1 Temp': '35C', 'Test CPU2 Temp': '39C', 'Test System Board Inlet Temp': '18C', 'Test System Board Exhaust Temp': '29C', 'Test System Board Pwr Consumption': '130Watts'}

有没有办法在不创建新字典的情况下获得想要的结果?

2 个答案:

答案 0 :(得分:5)

这是可能的,但一团糟。 Mad Physicist 给出的答案有效 - 但存在边缘情况,您需要制作字典键的列表副本才能使其工作。

使用字典理解要容易得多,只需一行。

name = 'Test'
result = {f"{name} {key}" : value for key, value in  result.items()}

答案 1 :(得分:4)

您必须交换字典对象中的键,因为没有“更改”不可变键这样的事情。一种方法是制作一个独立的列表:

for key in list(result):
    x = f"{name} {key}"
    result[x] = result[key]
    del result[key]

result 包裹在 list 中可确保您在修改 result 时迭代单独的对象。这使得原件具有 'x''Test x' 之类的键的角落情况保持开放。根据迭代顺序,您可能最终会在复制之前覆盖密钥。为避免这种情况,您可以在处理前按长度向后对键进​​行排序:

for key in sorted(result, key=len, reverse=True):
    ...