【发布时间】:2011-05-23 07:59:23
【问题描述】:
我想更改 Python 字典中条目的键。
有没有直接的方法来做到这一点?
【问题讨论】:
标签: python dictionary sequence
我想更改 Python 字典中条目的键。
有没有直接的方法来做到这一点?
【问题讨论】:
标签: python dictionary sequence
两步轻松搞定:
dictionary[new_key] = dictionary[old_key]
del dictionary[old_key]
或在 1 步中:
dictionary[new_key] = dictionary.pop(old_key)
如果dictionary[old_key] 未定义,这将引发KeyError。请注意,这将删除dictionary[old_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
【讨论】:
dict[new_value] = dict.pop(old_value, some_default_value) 来避免这种情况
old_key的位置会和new_key的位置不同。
dict 用作变量名。
如果你想改变所有的键:
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}
如果你想改变单键: 您可以接受上述任何建议。
【讨论】:
{ d1[key] : value for key, value in d.items() }
{(d1[k] if k in d1 else k):v for (k,v) in d.items() }
pop'n'fresh
>>>a = {1:2, 3:4}
>>>a[5] = a.pop(1)
>>>a
{3: 4, 5: 2}
>>>
【讨论】:
在 python 2.7 及更高版本中,您可以使用字典理解: 这是我在使用 DictReader 读取 CSV 时遇到的示例。用户已在所有列名后加上':'
ori_dict = {'key1:' : 1, 'key2:' : 2, 'key3:' : 3}
去除键中的尾随':':
corrected_dict = { k.replace(':', ''): v for k, v in ori_dict.items() }
【讨论】:
由于键是字典用来查找值的工具,因此您无法真正更改它们。您可以做的最接近的事情是保存与旧键关联的值,将其删除,然后使用替换键和保存的值添加新条目。其他几个答案说明了实现这一目标的不同方式。
【讨论】:
d = {1:2,3:4}
假设我们想要更改列表元素 p=['a' , 'b'] 的键。 下面的代码就可以了:
d=dict(zip(p,list(d.values())))
我们得到
{'a': 2, 'b': 4}
【讨论】:
如果你有一个复杂的dict,则表示dict中有一个dict或list:
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'}}
【讨论】:
没有直接的方法可以做到这一点,但你可以删除然后分配
d = {1:2,3:4}
d[newKey] = d[1]
del d[1]
或进行批量键更改:
d = dict((changeKey(k), v) for k, v in d.items())
【讨论】:
d = { changeKey(k): v for k, v in d.items()}
d = dict(...) 和 d = {...} 是同一个东西。 2013 年的另一条评论建议对另一个答案进行相同的更改。所以我假设它们不能相同,并且它们必须以某种有意义的方式有所不同。那是什么?
dict() 在传递生成器对象时的行为方式与 {...} 的行为方式可能存在差异。对于阅读的一些方向,我想说从这里开始:python.org/dev/peps/pep-0274
转换字典中的所有键
假设这是你的字典:
>>> 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'}
【讨论】:
这个函数得到一个字典,和另一个指定如何重命名键的字典;它返回一个带有重命名键的新字典:
def rekey(inp_dict, keys_replace):
return {keys_replace.get(k, k): v for k, v in inp_dict.items()}
测试:
def test_rekey():
assert rekey({'a': 1, "b": 2, "c": 3}, {"b": "beta"}) == {'a': 1, "beta": 2, "c": 3}
【讨论】:
print(inp_dict) 而不是assert 进行真实测试。尽管如此,还是比其他选择要好。
在一次更改所有键的情况下。 在这里,我正在阻止键。
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 键。即使您有嵌套的字典或列表。您可以执行类似的操作来应用其他转换。
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_str = {"FOO": "BAR", "BAR": 123, "EMB_LIST": [{"FOO": "bar", "Bar": 123}, {"FOO": "bar", "Bar": 123}], "EMB_DICT": {"FOO": "BAR", "BAR": 123, "EMB_LIST": [{"FOO": "bar", "Bar": 123}, {"FOO": "bar", "Bar": 123}]}}
lowercase_keys(json_str)
Out[0]: {'foo': 'BAR',
'bar': 123,
'emb_list': [{'foo': 'bar', 'bar': 123}, {'foo': 'bar', 'bar': 123}],
'emb_dict': {'foo': 'BAR',
'bar': 123,
'emb_list': [{'foo': 'bar', 'bar': 123}, {'foo': 'bar', 'bar': 123}]}}
【讨论】:
用下划线替换dict键中的空格,我用这个简单的路线...
for k in dictionary.copy():
if ' ' in k:
dictionary[ k.replace(' ', '_') ] = dictionary.pop(k, 'e r r')
或者只是 dictionary.pop(k) 注意 'er r' 可以是任何字符串,如果键不在字典中以能够替换它,它将成为新值,这不可能在这里发生。该参数是可选的,在可能遇到 KeyError 的其他类似代码中,添加 arg 可以避免它,但可以使用 'er r' 或您设置的任何值创建一个新键。
.copy() 避免 ... 迭代期间字典大小改变。
.keys() 不需要,k 是每个键,k 代表我头脑中的键。
(我使用的是 v3.7)
上面循环的单行代码是什么?
【讨论】:
您可以使用 iff/else 字典理解。此方法允许您在一行中替换任意数量的键。
key_map_dict = {'a':'apple','c':'cat'}
d = {'a':1,'b':2,'c':3}
d = {(key_map_dict[k] if k in key_map_dict else k):v for (k,v) in d.items() }
返回{'apple':1,'b':2,'cat':3}
【讨论】:
您可以将同一个值与多个键关联,或者只是删除一个键并重新添加一个具有相同值的新键。
例如,如果您有键->值:
red->1
blue->2
green->4
没有理由不能添加purple->2 或删除red->1 并添加orange->1
【讨论】:
如果有人想替换多级字典中所有出现的键的方法。
函数检查字典是否有特定的键,然后遍历子字典并递归调用函数:
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)
【讨论】:
完整解决方案示例
声明一个包含你想要的映射的 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)
创建此函数以使用您的映射格式化字典
def format_output(dict_to_format,format_dict):
for row in dict_to_format:
if row in format_dict.keys() and row != format_dict[row]:
dict_to_format[format_dict[row]] = dict_to_format.pop(row)
return dict_to_format
【讨论】:
注意 pop 的位置:
将要删除的键放在 pop() 之后
orig_dict['AAAAA' ] = orig_dict.pop('A')
orig_dict = {'A': 1, 'B' : 5, 'C' : 10, 'D' : 15}
# printing initial
print ("original: ", orig_dict)
# changing keys of dictionary
orig_dict['AAAAA'] = orig_dict.pop('A')
# printing final result
print ("Changed: ", str(orig_dict))
【讨论】:
我在下面编写了这个函数,您可以在其中将当前键名的名称更改为新键名。
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)
已在此处找到从列表键到字典键的转换:
https://www.geeksforgeeks.org/python-ways-to-change-keys-in-dictionary/
【讨论】:
使用pandas,您可以拥有这样的东西,
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['key'] = value
您甚至可以对对象属性执行此操作。 通过这样做将它们变成字典:
dict = vars(obj)
然后您可以像操作字典一样操作对象属性:
dict['attribute'] = value
【讨论】: