我有一个Python字典(uglyDict),它有一些非常不酷的键名。我想根据另一个字典(keyMapping)中的值重命名它们。下面是字典的一个例子:
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键:
prettyDict = {}
for mkey, mval in keyMapping.items():
for ukey in uglyDict.keys():
if mkey == ukey:
prettyDict[mval] = uglyDict[mkey]
print(prettyDict)代码按需要工作,并打印带有重命名键的字典,如下所示:
{'ORDER_NUMBER': '6492', 'ShipToCompany': 'J.B Brawls', 'ShipToAddress1': '42 BAN ROAD', 'ShipToCity': 'Jimville', 'ShipToState': 'VA', 'ShipToZipcode': '42691'}我的问题是,有没有更有效/更毕达通的方法来做到这一点?最好是不用翻两本字典的键的地方。我使用这段代码时,字典要大得多,需要性能。
欢迎有识之士!
发布于 2021-07-11 12:34:04
字典的要点是查找是快速的,但是即使您的keyMapping已经是一本字典,您也不会使用它。让我们看看你的代码。
prettyDict = {}
for mkey, mval in keyMapping.items():
for ukey in uglyDict.keys():
if mkey == ukey:
prettyDict[mval] = uglyDict[mkey]即使uglyDict很小,也可以迭代键映射的所有元素。这似乎是一个糟糕的起点,所以让我们扭转这两个循环。
prettyDict = {}
for ukey in uglyDict.keys():
for mkey, mval in keyMapping.items():
if mkey == ukey:
prettyDict[mval] = uglyDict[mkey]在最后一行中,mkey等于ukey,因此我们可以将其更改为uglyDict[ukey],当然您也知道如何完全避免这种查找:
prettyDict = {}
for ukey, uval in uglyDict.items():
for mkey, mval in keyMapping.items():
if mkey == ukey:
prettyDict[mval] = uval让我们现在集中讨论中间部分:
for mkey, mval in keyMapping.items():
if mkey == ukey:在这里,我们寻找ukey在keyMapping中的值,但是毫无疑问,这就是字典的意义所在,并且我们不需要遍历所有的条目就可以做到这一点。
prettyDict = {}
for ukey, uval in uglyDict.items():
if ukey in keyMapping:
mval = keyMapping[ukey]
prettyDict[mval] = uval这样好多了。从这里开始,我们可以用字典理解来重新表述,就像ggorien的答案一样,如果你喜欢的话。
prettyDict = {
keyMapping[ukey]: uval
for ukey, uval in uglyDict.items()
if ukey in keyMapping
}更重要的是,您应该决定如何处理ukey不在keyMapping中的情况。(您的例子似乎在ORDER_NUMBER中出错了,顺便说一句。)如果这是一个错误,只需省略if ukey in keyMapping并在其他地方处理异常。或者在这种情况下你可以保留原来的钥匙:
prettyDict = {
keyMapping.get(ukey, ukey): uval
for ukey, uval in uglyDict.items()
}https://codereview.stackexchange.com/questions/263904
复制相似问题