如何重新映射python dict键

时间:2009-03-13 19:11:22

标签: python dictionary

我正在开发一个程序,其中(除其他外)读取CSV文件(它以[{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]形式存储为一个dicts数组)。对于每一行,作为其他处理的一部分,我需要将这些键重新映射到用户输入的值,这些值在另一个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()))

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

5 个答案:

答案 0 :(得分:24)

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())
    ...

或者在带有Dict Comprehensions的Python2.7 +中:

for row in rows:
    row = {name_map[name]: val for name, val in row.items()}

答案 1 :(得分:4)

如果您使用的是Python 2.7或Python 3.x,则可以使用dictionary comprehension。这相当于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()}
    ...

答案 2 :(得分:2)

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]

这就是你想要的吗?

答案 3 :(得分:0)

此功能将使您仅重新映射需要更改的键。

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

答案 4 :(得分:0)

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'}