首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在不改变位置的情况下重命名字典中的键?

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

Stack Overflow用户
提问于 2019-06-07 21:46:35
回答 3查看 498关注 0票数 2

我有一个字典,其中我想重命名一些字典键,这是小写到camel大小写,但我想保持序列。有什么办法来保持诚信吗?

我正在写一款清洁剂,它可以帮助我做同样的事情,看起来就像这样

代码语言:javascript
复制
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

假设我的字典是这样的

代码语言:javascript
复制
person_data = {
    'id': 5,
    'firstname': 'Bob',
    'lastname': 'Woolmer',
    'gender': 'Male',
    'country': 'USA'
    'emailid': 'abs@gmail.com'
}

我得到以下输出:

代码语言:javascript
复制
{
 'gender': 'Male',
 'country': 'USA',
 'ID': 5,
 'firstName': 'Bob',
 'lastName': 'Woolmer',
 'emailId': 'abs@gmail.com'
}

我想要的输出是:

代码语言:javascript
复制
{
 'ID': 5,
 'firstName': 'Bob',
 'lastName': 'Woolmer',
 'gender': 'Male',
 'country': 'USA',
 'emailId': 'abs@gmail.com'
}

是否有一种方法来维护一个序列,以防我在动态字典中复制它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-07 22:04:20

如果您可以将原始字典更改为OrderedDicts,下面这样的内容就可以了:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
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')])
票数 1
EN

Stack Overflow用户

发布于 2019-06-07 21:54:41

保存原始密钥:

代码语言:javascript
复制
order = d.keys()

修改钥匙。按原始顺序重新构建字典:

代码语言:javascript
复制
d = {k: d[k] for k in order}

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

票数 0
EN

Stack Overflow用户

发布于 2019-06-07 21:59:42

您可以使用字典理解,并使用默认值的字典get方法。

代码语言:javascript
复制
{name_cleanse_dict.get(key,key):value for (key,value) in person_data.items()}

订单由Python3.6+保证,否则您应该使用OrderedDict

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56501562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档