如何重新映射Python字典键

37

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

我的方法接近正确,但只有在已知字段顺序相同时才有效。

6个回答

38
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+ 中,也可以使用字典推导式

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

6
如果您正在使用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()}
    ...

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]

这是您需要的吗?


4

Python 3.7

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

{ m[k]:d[k] for k in d }

输出

{'goodname1': 'data1', 'goodname2': 'data2'}

1
使用f-strings是完全不必要的。{ m[k]:d[k] for k in d }同样有效。 - Nils Werner
如果你想安全地处理可能包含其他键的对象,可以使用{m.get(k, k): value[k] for k in value},其中km.get(k)的默认值。 - brandonscript

3

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

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

0

基于这个示例

edited_dict = {'oldname1': 'data1', 'oldname2': 'data2', 'goodname3': 'data3'}
remaped_key = {'oldname1': 'key_1', 'oldname2': 'key_2'}

{ remaped_key[key]:edited_dict[key] for key in edited_dict if key in remaped_key }
# output
{'key_1': 'data1', 'key_2': 'data2'}

# same result:
dict((remaped_key[key], edited_dict[key]) for key, value in edited_dict.items() if key in remaped_key)
# output
{'key_1': 'data1', 'key_2': 'data2'}

或者仅重新映射所需的键:

edited_dict = {'oldname1': 'data1', 'oldname2': 'data2', 'goodname3': 'data3'}
remaped_key = {'oldname1': 'key_1', 'oldname2': 'key_2'}

dict((remaped_key[key], edited_dict[key]) if key in remaped_key else (key, value) for key, value in edited_dict.items())
# output
{'key_1': 'data1', 'key_2': 'data2', 'goodname3': 'data3'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接