Python 是否可以在不改变位置的情况下重命名字典中的键?

Python 是否可以在不改变位置的情况下重命名字典中的键?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个字典,我想把一些字典键从小写改为驼峰大小写,但我想保持顺序。有没有办法保持完整性 我正在写一个清洁剂,它将帮助与同样的,它看起来像这样 def key_cleanser(data): name_cleanse_dict = { 'id': 'ID', 'emailid': 'emailId', 'firstname': 'firstName', 'middlename': 'middleName',

我有一个字典,我想把一些字典键从小写改为驼峰大小写,但我想保持顺序。有没有办法保持完整性

我正在写一个清洁剂,它将帮助与同样的,它看起来像这样

def key_cleanser(data):
    name_cleanse_dict = {
        'id': 'ID',
        'emailid': 'emailId',
        'firstname': 'firstName',
        'middlename': 'middleName',
        'lastname': 'lastName',
        'addressline1': 'addressLine1',
        'addressline2': 'addressLine2',
        'addressline3': 'addressLine3',
        'postalcode': 'postalCode',
    }
    if isinstance(data, dict):
        dictionary = data.copy()
        dict_keys = list(dictionary.keys())
        for key in dict_keys:
            if key in name_cleanse_dict.keys():
                dictionary[name_cleanse_dict[key]] = dictionary.pop(key)
                key = name_cleanse_dict[key]
        return dictionary
    return data
person_data = {
    'id': 5,
    'firstname': 'Bob',
    'lastname': 'Woolmer',
    'gender': 'Male',
    'country': 'USA'
    'emailid': 'abs@gmail.com'
}
假设我的字典是这样的

def key_cleanser(data):
    name_cleanse_dict = {
        'id': 'ID',
        'emailid': 'emailId',
        'firstname': 'firstName',
        'middlename': 'middleName',
        'lastname': 'lastName',
        'addressline1': 'addressLine1',
        'addressline2': 'addressLine2',
        'addressline3': 'addressLine3',
        'postalcode': 'postalCode',
    }
    if isinstance(data, dict):
        dictionary = data.copy()
        dict_keys = list(dictionary.keys())
        for key in dict_keys:
            if key in name_cleanse_dict.keys():
                dictionary[name_cleanse_dict[key]] = dictionary.pop(key)
                key = name_cleanse_dict[key]
        return dictionary
    return data
person_data = {
    'id': 5,
    'firstname': 'Bob',
    'lastname': 'Woolmer',
    'gender': 'Male',
    'country': 'USA'
    'emailid': 'abs@gmail.com'
}
我得到以下输出:

{
 'gender': 'Male',
 'country': 'USA',
 'ID': 5,
 'firstName': 'Bob',
 'lastName': 'Woolmer',
 'emailId': 'abs@gmail.com'
}
我想要的输出是:

{
 'ID': 5,
 'firstName': 'Bob',
 'lastName': 'Woolmer',
 'gender': 'Male',
 'country': 'USA',
 'emailId': 'abs@gmail.com'
}

是否有一种方法来维护序列,以防我为动态词典复制该序列。

保存原始密钥:

order = d.keys()
修改关键点。按原始顺序重新生成词典:

d = {k: d[k] for k in order}

此解决方案仅适用于Python 3.6+

您可以使用dict comprehension,dictionary
get
方法和默认值

{name_cleanse_dict.get(key,key):value for (key,value) in person_data.items()}

Python3.6+保证了顺序,否则,如果您可以将原始词典更改为OrderedDicts,则应使用
OrderedDicts

,类似的操作如下:

from collections import OrderedDict

def clense_data(data):
  name_cleanse_dict = {
    'id': 'ID',
    'emailid': 'emailId',
    'firstname': 'firstName',
    'middlename': 'middleName',
    'lastname': 'lastName',
    'addressline1': 'addressLine1',
    'addressline2': 'addressLine2',
    'addressline3': 'addressLine3',
    'postalcode': 'postalCode',
  }
  if isinstance(data, dict):
    return OrderedDict([(name_cleanse_dict[k], v) if k in name_cleanse_dict else (k, v) for k, v in data.items()])
  return data

def main():
  person_data = OrderedDict([('id', 5),
                             ('firstname', 'Bob'),
                             ('lastname', 'Woolmer'),
                             ('gender', 'Male'),
                             ('country', 'USA'),
                             ('emailid', 'abs@gmail.com')])
  print(person_data)
  new_person_data = clense_data(person_data)
  print(new_person_data)

if __name__ == '__main__':
  main()
输出:

OrderedDict([('id', 5), ('firstname', 'Bob'), ('lastname', 'Woolmer'), ('gender', 'Male'), ('country', 'USA'), ('emailid', 'abs@gmail.com')])
OrderedDict([('ID', 5), ('firstName', 'Bob'), ('lastName', 'Woolmer'), ('gender', 'Male'), ('country', 'USA'), ('emailId', 'abs@gmail.com')])

Python字典的可能重复项通常是不按顺序排列的,因为值是通过键而不是索引访问的。你为什么要保留这些位置?我不想按键对字典排序。我想维护键的顺序,即使对于大多数已发布的Python版本,第一个键以“Z”开头,也根本不存在字典条目的“位置”这样的事情。字典不存储位置;这些位置只是密钥散列排序的偶然/巧合产物,由于散列是密钥本身的间接派生,因此没有对其进行高级控制(试图强制控制可能会降低存储效率)。@ArpitAcharya如果您不使用python-3.6或更新版本,即使不对键做任何操作,如果您只是使用
JSON
包从JSON输入读取字典,顺序也不一样。在这种情况下,标签应该更改为
python-3.6