如何重新映射python dict键

如何重新映射python dict键,python,dictionary,iterator,Python,Dictionary,Iterator,我正在开发一个程序,该程序(除其他外)在中读取CSV文件(它以[{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]的形式存储为dict数组))。对于每一行,作为其他处理的一部分,我需要将这些键重新映射到用户输入的值,这些值在另一个dict中提供,以便它们可以用作API调用中的参数。映射数组的格式为:{badname1:goodname1,badname2:goodname2,…} 因此,我想从以下方面获得: {badname1:data1,

我正在开发一个程序,该程序(除其他外)在中读取CSV文件(它以
[{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]的形式存储为dict数组)
)。对于每一行,作为其他处理的一部分,我需要将这些键重新映射到用户输入的值,这些值在另一个dict中提供,以便它们可以用作API调用中的参数。映射数组的格式为:
{badname1:goodname1,badname2:goodname2,…}

因此,我想从以下方面获得:

{badname1:data1, badname2:data2,...}` to `{goodname1:data1, goodname2:data2,...}
我想使用类似于
zip()
(尽管
zip()
会产生
{badname1:badname1,…}

似乎应该有一个明显的解决办法暗示着我

如果数据在
a
中,映射在
b
中:

dict(zip(b,a.itervalues()))
我很接近,但它只在已知字段的顺序与我认为的相同的情况下才起作用

name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...}

for row in rows:
    # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'}
    row = dict((name_map[name], val) for name, val in row.iteritems())
    ...
或在Python2.7+中使用:


这就是您想要的吗?

如果您使用的是Python 2.7或Python 3.x,则可以使用。这相当于elo80ka的答案(使用列表理解),但生成的代码可读性稍高一些

name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...}

for row in rows:
    # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'}
    row = {name_map[name]: val for name, val in row.iteritems()}
    ...

此功能仅允许您重新映射需要更改的键

def key_remapper(dictionary: dict):
    return {remap_dictionary.get(k, v): v for k, v in dictionary.items()}
Python 3.7

d = {'badname1': 'data1', 'badname2': 'data2'}
m = {'badname1': 'goodname1', 'badname2': 'goodname2'}

{ f'{m[k]}':d[k] for k in d }
输出

{'goodname1': 'data1', 'goodname2': 'data2'}
d = {'badname1': 'data1', 'badname2': 'data2'}
m = {'badname1': 'goodname1', 'badname2': 'goodname2'}

{ f'{m[k]}':d[k] for k in d }
{'goodname1': 'data1', 'goodname2': 'data2'}