更改字典中键的名称

时间:2010-12-10 07:09:21

标签: python dictionary sequence

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

有直接的方法吗?

20 个答案:

答案 0 :(得分:556)

通过两个步骤轻松完成:

dictionary[new_key] = dictionary[old_key]
del dictionary[old_key]

或者一步到位:

dictionary[new_key] = dictionary.pop(old_key)
如果KeyError未定义,

将引发dictionary[old_key]。请注意,此删除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

答案 1 :(得分:49)

如果您想更改所有密钥:

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}

如果您想更改单个键:    您可以使用上述任何建议。

答案 2 :(得分:29)

pop'n'fresh

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

答案 3 :(得分:21)

在python 2.7及更高版本中,您可以使用字典理解: 这是我在使用DictReader读取CSV时遇到的一个示例。用户使用':'

为所有列名添加了后缀

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

去除键中的尾随':':

corrected_dict = { k.replace(':', ''): v for k, v in ori_dict.items() }

答案 4 :(得分:6)

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

答案 5 :(得分:5)

如果你有一个复杂的字典,那就意味着字典中有一个字典或列表:

import {bootstrap}     from '@angular/platform-browser-dynamic';
import {HeroComponent} from './components/hero/hero.component';
import { HTTP_PROVIDERS } from '@angular/http';
declare var module:any;
bootstrap(HeroComponent, [ HTTP_PROVIDERS ]);

答案 6 :(得分:4)

此函数获得一个字典,另一个字典指定如何重命名键;它会返回带有重命名键的新字典:

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}

答案 7 :(得分:4)

转换字典中的所有键

假设这是你的字典:

>>> 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'}

答案 8 :(得分:3)

没有直接的方法可以执行此操作,但您可以删除 - 然后分配

d = {1:2,3:4}

d[newKey] = d[1]
del d[1]

或进行质量密钥更改:

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

答案 9 :(得分:2)

这将小写所有的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}]}}

答案 10 :(得分:1)


用下划线替换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 避免了它,但可以使用该 'e r r' 或您将其设置为值的任何内容创建一个新键。

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

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

(我使用的是 v3.7)

Info on dictionary pop()

上面循环的单行是什么?

答案 11 :(得分:0)

d = {1:2,3:4}

假设我们要更改列表元素p = ['a','b']的键。 以下代码即可:

d=dict(zip(p,list(d.values()))) 

我们得到

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

答案 12 :(得分:0)

如果一次更改所有键。 在这里,我正在扼杀钥匙。

    {React.Children.map(this.props.children, (child, index) => (
      if(index === 0) {
        React.cloneElement(
          child,
          {
            isFirst
          }
        )
      }
      else if (index === React.Children.count - 1) {
        // Same as above but with isLast
      }
      else {
        React.cloneElement(child);
      }
    ))}

答案 13 :(得分:0)

如果有人想替换多级字典中所有出现的键的方法。

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

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)

答案 14 :(得分:0)

完整解决方案的示例

声明一个包含所需映射的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

答案 15 :(得分:0)

请注意流行音乐的位置:
在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)) 

答案 16 :(得分:0)

我在下面编写了此函数,您可以在其中将当前键名更改为新键名。

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/

答案 17 :(得分:0)

使用 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'}

答案 18 :(得分:0)

您可以将相同的值与多个键相关联,或者只需删除一个键并重新添加具有相同值的新键。

例如,如果您有keys-&gt;值:

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

您无法添加purple->2或删除red->1并添加orange->1

答案 19 :(得分:-2)

我没有看到这个确切的答案:

dict['key'] = value

您甚至可以对对象属性执行此操作。 通过这样做将它们变成字典:

dict = vars(obj)

然后你就像操作字典一样操纵对象属性:

dict['attribute'] = value