如何正确更改密钥名称?

时间:2018-02-12 08:48:35

标签: python python-3.x dictionary

我想更改字典中的密钥名称,我使用的代码如下:

for key in my_dict_other:
    print(key)
    new_key = key + '/' + str(my_dict[key])
    print(new_key)
    my_dict_other[new_key] = my_dict_other.pop(key)

我遇到的问题是在首次成功进行代码处理后出现关键错误

输出:

38-7
38-7/[2550, 1651]
13-9
13-9/[2550, 1651]
16-15
16-15/[5100, 3301]
31-0/[5400, 3601]
Traceback (most recent call last):
    new_key = key + '/' + str(my_dict[key])
KeyError: '31-0/[5400, 3601]'

并且每次都使用不同的密钥获取错误,因此无法理解问题的模式或我的代码有什么问题

修改: my_dict_other的结构:

'41-3': [['2436', '2459', '1901', '2152'],
                      ['2704', '2253', '2442', '2062'],
                      ['2763', '2595', '2498', '2518'],
                      ['2190', '1918', '1970', '1875'],
                      ['3154', '2442', '3023', '2417'],
                      ['3360', '2481', '3252', '2458'],
                      ['653', '1916', '430', '1874'],

my_dict的结构:

'1-0': [5400, 3601],
 '1-1': [2550, 1651],
 '1-3': [5400, 3601],
 '1-4': [5400, 3601],
 '1-5': [5400, 3601],

3 个答案:

答案 0 :(得分:4)

在迭代时,您正在弹出并向dict添加键。不要这样做。你可以,例如循环遍历您提取的键列表:

for key in list(my_dict_other):  # loop over key list, not dict itself
    new_key = key + '/' + str(my_dict[key])  # assuming key in my_dict!
    my_dict_other[new_key] = my_dict_other.pop(key)

答案 1 :(得分:1)

您的代码存在以下几个问题:

for key in my_dict_other:
    new_key = key + '/' + str(my_dict[key])
    my_dict_other[new_key] = my_dict_other.pop(key)
  1. 您正在更改正在循环的对象..这是 no-no 。添加元素也会让循环变得无穷无尽!
  2. 您正在遍历my_dict_other的键并为每个键执行my_dict[key]。你确定my_dict包含它们吗?如果没有,请执行my_dict.get(key, '')或在其中添加if支票。
  3. 他们最大的失败,最终导致你的代码破坏的原因是 1。&的 2 即可。您在第一次迭代中添加了密钥'31-0/[5400, 3601]',并且在某些时候它变为您的key(如在for key in my_dict_other密钥中),这当然在my_dict中不存在,因此KeyError

答案 2 :(得分:0)

[为了完整起见]除了schwobaseggl的答案之外,您还可以将新的键值写入带有新名称的新词典中:

fresh = {}
for key in my_dict_other: 
    fresh[(key + '/' + str(my_dict[key]))] = my_dict_other(key)

但是正如Ev.Kounis所提到的,你需要确保你的my_dict字典包含相同的密钥......你从.pop调用中得到KeyError的原因可能是由于密钥isn'在你的my_dict中。