Python 更改字典中键的名称

Python 更改字典中键的名称,python,dictionary,sequence,Python,Dictionary,Sequence,我想更改Python字典中条目的键 有没有简单的方法可以做到这一点?只需两个步骤即可轻松完成: dictionary[new_key] = dictionary[old_key] del dictionary[old_key] 或在1步中: dictionary[new_key] = dictionary.pop(old_key) 如果未定义dictionary[old_key],则将引发keyror。请注意,这将删除字典[old\u key] >>> dictionary

我想更改Python字典中条目的键


有没有简单的方法可以做到这一点?

只需两个步骤即可轻松完成:

dictionary[new_key] = dictionary[old_key]
del dictionary[old_key]
或在1步中:

dictionary[new_key] = dictionary.pop(old_key)
如果未定义
dictionary[old_key]
,则将引发
keyror
。请注意,这将删除
字典[old\u key]

>>> dictionary = { 1: 'one', 2:'two', 3:'three' }
>>> dictionary['ONE'] = dictionary.pop(1)
>>> dictionary
{2: 'two', 3: 'three', 'ONE': 'one'}
>>> dictionary['ONE'] = dictionary.pop(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 1
字典={1:'1',2:'2',3:'3'} >>>dictionary['ONE']=dictionary.pop(1) >>>字典 {2:'二',3:'三','一':'一'} >>>dictionary['ONE']=dictionary.pop(1) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 关键错误:1
您可以将相同的值与多个键关联,或者只需删除一个键并重新添加具有相同值的新键

例如,如果您有键->值:

red->1
blue->2
green->4

没有理由不能添加
紫色->2
或删除
红色->1
和添加
橙色->1
没有直接的方法,但您可以删除然后分配

d = {1:2,3:4}

d[newKey] = d[1]
del d[1]
或者进行批量关键点更改:

d = dict((changeKey(k), v) for k, v in d.items())
新鲜的

>>>a = {1:2, 3:4}
>>>a[5] = a.pop(1)
>>>a
{3: 4, 5: 2}
>>> 

如果要更改所有键,请执行以下操作:

d = {'x':1, 'y':2, 'z':3}
d1 = {'x':'a', 'y':'b', 'z':'c'}

In [10]: dict((d1[key], value) for (key, value) in d.items())
Out[10]: {'a': 1, 'b': 2, 'c': 3}
如果要更改单键:
您可以接受上面的任何建议。

因为字典使用键查找值,所以您不能真正更改它们。您可以做的最接近的事情是保存与旧密钥关联的值,删除它,然后使用替换密钥和保存的值添加一个新条目。其他几个答案说明了实现这一点的不同方法。

我还没有看到确切的答案:

dict['key'] = value
您甚至可以对对象属性执行此操作。 通过以下操作将它们编入词典:

dict = vars(obj)
然后可以像操作字典一样操作对象属性:

dict['attribute'] = value
>>> sample = {'person-id': '3', 'person-name': 'Bob'}

在python 2.7及更高版本中,可以使用字典理解: 这是我在使用DictReader读取CSV时遇到的一个示例。用户已将所有列名的后缀添加为“:”

ori_dict={'key1:':1,'key2:':2,'key3:':3}

要除去键中的尾随“:”:

d = {'x':1, 'y':2, 'z':3}
d1 = {'x':'a', 'y':'b', 'z':'c'}

In [10]: dict((d1[key], value) for (key, value) in d.items())
Out[10]: {'a': 1, 'b': 2, 'c': 3}

corrected_dict={k.replace(':',''):v代表k,v在ori_dict.items()中

如果您有一个复杂的dict,则表示dict中有一个dict或列表:

myDict = {1:"one",2:{3:"three",4:"four"}}
myDict[2][5] = myDict[2].pop(4)
print myDict

Output
{1: 'one', 2: {3: 'three', 5: 'four'}}

以防同时更换所有钥匙。 我在这里堵住钥匙

a = {'making' : 1, 'jumping' : 2, 'climbing' : 1, 'running' : 2}
b = {ps.stem(w) : a[w] for w in a.keys()}
print(b)
>>> {'climb': 1, 'jump': 2, 'make': 1, 'run': 2} #output

转换字典中的所有键

假设这是你的字典:

dict['attribute'] = value
>>> sample = {'person-id': '3', 'person-name': 'Bob'}
要将示例字典键中的所有破折号转换为下划线,请执行以下操作:

>>> sample = {key.replace('-', '_'): sample.pop(key) for key in sample.keys()}
>>> sample
>>> {'person_id': '3', 'person_name': 'Bob'}
假设我们想要更改列表元素p=['a','b']的键。 以下代码将执行以下操作:

d=dict(zip(p,list(d.values()))) 
我们得到了

{'a': 2, 'b': 4}

此函数获取一个dict,另一个dict指定如何重命名键;它返回一个新的dict,其中包含重命名的键:

def rekey(inp_dict, keys_replace):
    return {keys_replace.get(k, k): v for k, v in inp_dict.items()}
测试:


方法,如果任何人希望替换多级字典中出现的所有键

函数检查字典是否具有特定键,然后迭代子字典并递归调用函数:

def update_keys(old_key,new_key,d):
    if isinstance(d,dict):
        if old_key in d:
            d[new_key] = d[old_key]
            del d[old_key]
        for key in d:
            updateKey(old_key,new_key,d[key])

update_keys('old','new',dictionary)

这将降低所有dict键的大小写。即使您有嵌套的dict或列表。您可以执行类似的操作来应用其他转换

def lowercase_keys(obj):
  if isinstance(obj, dict):
    obj = {key.lower(): value for key, value in obj.items()}
    for key, value in obj.items():         
      if isinstance(value, list):
        for idx, item in enumerate(value):
          value[idx] = lowercase_keys(item)
      obj[key] = lowercase_keys(value)
  return obj 

完整解的一个例子

声明包含所需映射的json文件

{
  "old_key_name": "new_key_name",
  "old_key_name_2": "new_key_name_2",
}
加载它

with open("<filepath>") as json_file:
    format_dict = json.load(json_file)

注意pop的位置:
将要删除的密钥放在pop()之后。
orig_dict['AAAAA']=orig_dict.pop('A')


我在下面编写了这个函数,您可以在其中将当前密钥名的名称更改为新名称

def change_dictionary_key_name(dict_object, old_name, new_name):
    '''
    [PARAMETERS]: 
        dict_object (dict): The object of the dictionary to perform the change
        old_name (string): The original name of the key to be changed
        new_name (string): The new name of the key
    [RETURNS]:
        final_obj: The dictionary with the updated key names
    Take the dictionary and convert its keys to a list.
    Update the list with the new value and then convert the list of the new keys to 
    a new dictionary
    '''
    keys_list = list(dict_object.keys())
    for i in range(len(keys_list)):
        if (keys_list[i] == old_name):
            keys_list[i] = new_name

    final_obj = dict(zip(keys_list, list(dict_object.values()))) 
    return final_obj
假设是JSON,您可以调用它并通过以下行重命名它:

data = json.load(json_file)
for item in data:
    item = change_dictionary_key_name(item, old_key_name, new_key_name)
在这里可以找到从列表键到字典键的转换:

使用,您可以获得类似的内容

from pandas import DataFrame
df = DataFrame([{"fruit":"apple", "colour":"red"}])
df.rename(columns = {'fruit':'fruit_name'}, inplace = True)
df.to_dict('records')[0]
>>> {'fruit_name': 'apple', 'colour': 'red'}

用下划线替换dict键中的空格,我使用这个简单的方法

for k in dictionary.copy():
    if ' ' in k:
        dictionary[ k.replace(' ', '_') ] = dictionary.pop(k, 'e r r')

或者只是
dictionary.pop(k)
Note“e r r”可以是任何字符串,如果该键不在dictionary中,它将成为新值,以便能够替换它,这在这里是不可能发生的。该参数是可选的,在其他类似的代码中可能会遇到KeyError,添加的arg可以避免该参数,但可以使用该“e r”或您将其设置为值的任何内容创建新的键

.copy()避免。。。字典在迭代过程中更改了大小

.keys()不需要,k是每个键,k代表我头脑中的键

(我正在使用v3.7)


上面循环的一行是什么?

这将创建一个新的字典,而不是更新现有的字典——这可能并不重要,但不是所要求的。字典理解的答案相同:
{d1[key]:key的值,d.items()中的值
如果密钥不存在,这会以任何方式引发密钥错误,但是您可以使用
dict[new\u value]=dict.pop(old\u value,some\u default\u value)
来避免这种情况。请注意,这也会影响CPython 3.6+/pypypy和Python 3.7+中密钥的位置。一般来说,
old_key
的位置将与
new_key
的位置不同@TobiasKienzler注意不要将
dict
用作变量名。@Mew完全正确,太糟糕了,我无法编辑该注释,我不知道这与问题有什么关系;您能详细说明一下吗?“AttributeError:‘dict’对象没有‘replace’属性”user1318125,我建议尝试复制粘贴。这在python控制台中对我有效(对用作键的字符串执行.replace),请参见:
d={changeKey(k):v代表k,v代表d.items()}
@Erich一目了然,
d=dict(…)
d={…}
是相同的东西。2013年的另一条评论建议对另一个答案进行同样的修改。所以我假设它们一定不一样,它们一定以某种有意义的方式不同。那是什么方式?@Unknow0059我的理解是,它是语法上的糖。这至少是我添加此评论的原因。实际上可能有
from pandas import DataFrame
df = DataFrame([{"fruit":"apple", "colour":"red"}])
df.rename(columns = {'fruit':'fruit_name'}, inplace = True)
df.to_dict('records')[0]
>>> {'fruit_name': 'apple', 'colour': 'red'}
for k in dictionary.copy():
    if ' ' in k:
        dictionary[ k.replace(' ', '_') ] = dictionary.pop(k, 'e r r')