Python 更改字典中键的名称
我想更改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
有没有简单的方法可以做到这一点?只需两个步骤即可轻松完成:
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')