首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个dict的值中高效地重命名dict键- Python

从另一个dict的值中高效地重命名dict键- Python
EN

Code Review用户
提问于 2021-07-09 14:48:38
回答 1查看 5.5K关注 0票数 10

我有一个Python字典(uglyDict),它有一些非常不酷的键名。我想根据另一个字典(keyMapping)中的值重命名它们。下面是字典的一个例子:

代码语言:javascript
复制
uglyDict = {
    "ORDER_NUMBER": "6492",
    "Ship To - Name": "J.B Brawls",
    "Ship To - Address 1": "42 BAN ROAD",
    "Ship To - City": "Jimville",
    "Ship To - State": "VA",
    "Ship To - Postal Code": "42691"
}

keyMapping = {
    "Market - Store Name": "WSCUSTOMERID",
    "Ship To - Name": "ShipToCompany",
    "Ship To - Country": "ShipToCountryCode",
    "Ship To - Postal Code": "ShipToZipcode",
    "Ship To - City": "ShipToCity",
    "Date - Order Date": "OrderDate",
    "Gift - Message": "SpecialInstructions",
    "Customer Email": "ShipToEmail",
    "Ship To - Address 2": "ShipToAddress2",
    "Ship To - Address 1": "ShipToAddress1",
    "Ship To - Phone": "ShipToPhoneNum",
    "Order - Number": "ORDER_NUMBER",
    "Ship To - State": "ShipToState",
    "Carrier - Service Selected": "ShipMethod",
    "Item - SKU": "PRODUCT_NUMBER",
    "Item - Qty": "Quantity"
}

到目前为止,我的代码是重命名uglyDict的S键:

代码语言:javascript
复制
prettyDict = {}
for mkey, mval in keyMapping.items():
    for ukey in uglyDict.keys():
        if mkey == ukey:
            prettyDict[mval] = uglyDict[mkey]

print(prettyDict)

代码按需要工作,并打印带有重命名键的字典,如下所示:

代码语言:javascript
复制
{'ORDER_NUMBER': '6492', 'ShipToCompany': 'J.B Brawls', 'ShipToAddress1': '42 BAN ROAD', 'ShipToCity': 'Jimville', 'ShipToState': 'VA', 'ShipToZipcode': '42691'}

我的问题是,有没有更有效/更毕达通的方法来做到这一点?最好是不用翻两本字典的键的地方。我使用这段代码时,字典要大得多,需要性能。

欢迎有识之士!

EN

回答 1

Code Review用户

发布于 2021-07-11 12:34:04

字典的要点是查找是快速的,但是即使您的keyMapping已经是一本字典,您也不会使用它。让我们看看你的代码。

代码语言:javascript
复制
prettyDict = {}
for mkey, mval in keyMapping.items():
    for ukey in uglyDict.keys():
        if mkey == ukey:
            prettyDict[mval] = uglyDict[mkey]

即使uglyDict很小,也可以迭代键映射的所有元素。这似乎是一个糟糕的起点,所以让我们扭转这两个循环。

代码语言:javascript
复制
prettyDict = {}
for ukey in uglyDict.keys():
    for mkey, mval in keyMapping.items():
        if mkey == ukey:
            prettyDict[mval] = uglyDict[mkey]

在最后一行中,mkey等于ukey,因此我们可以将其更改为uglyDict[ukey],当然您也知道如何完全避免这种查找:

代码语言:javascript
复制
prettyDict = {}
for ukey, uval in uglyDict.items():
    for mkey, mval in keyMapping.items():
        if mkey == ukey:
            prettyDict[mval] = uval

让我们现在集中讨论中间部分:

代码语言:javascript
复制
    for mkey, mval in keyMapping.items():
        if mkey == ukey:

在这里,我们寻找ukeykeyMapping中的值,但是毫无疑问,这就是字典的意义所在,并且我们不需要遍历所有的条目就可以做到这一点。

代码语言:javascript
复制
prettyDict = {}
for ukey, uval in uglyDict.items():
    if ukey in keyMapping:
        mval = keyMapping[ukey]
        prettyDict[mval] = uval

这样好多了。从这里开始,我们可以用字典理解来重新表述,就像ggorien的答案一样,如果你喜欢的话。

代码语言:javascript
复制
prettyDict = {
    keyMapping[ukey]: uval
    for ukey, uval in uglyDict.items()
    if ukey in keyMapping
}

更重要的是,您应该决定如何处理ukey不在keyMapping中的情况。(您的例子似乎在ORDER_NUMBER中出错了,顺便说一句。)如果这是一个错误,只需省略if ukey in keyMapping并在其他地方处理异常。或者在这种情况下你可以保留原来的钥匙:

代码语言:javascript
复制
prettyDict = {
    keyMapping.get(ukey, ukey): uval
    for ukey, uval in uglyDict.items()
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/263904

复制
相关文章

相似问题

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