如何重新映射python dict键

acr*_*man 23 python dictionary

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

所以我想从: {badname1:data1, badname2:data2,...}{goodname1:data1, goodname2:data2,...}

我想使用类似的东西zip()(虽然zip()收益率{badname1:badname1,...}).

似乎应该有一个明显的解决方案,暗指我.

编辑:如果数据在a和映射b:

dict(zip(b,a.itervalues()))

我接近了,但它只适用于已知字段与我认为的顺序相同的情况.

elo*_*0ka 27

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())
    ...
Run Code Online (Sandbox Code Playgroud)

或者在Python2.7 +中使用Dict理解:

for row in rows:
    row = {name_map[name]: val for name, val in row.items()}
Run Code Online (Sandbox Code Playgroud)

  • 是的.也可以在没有[]的情况下作为生成器表达式. (2认同)

Jon*_*Jon 5

rows = [{"col1":"data1a","col2":"data2a"},{"col1":"data1b","col2":"data2b"}]
name_map = {"col1":"newcol1","col2":"newcol2"}

new_rows = [dict(zip(map(lambda x: name_map[x], r.keys()), r.values())) for r in rows]
Run Code Online (Sandbox Code Playgroud)

这是你追求的吗?


小智 5

如果您使用的是 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()}
    ...
Run Code Online (Sandbox Code Playgroud)