我正在开发一个程序,其中(除其他外)读取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()))
我接近了,但它只适用于已知字段与我想的顺序相同的情况。
答案 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'}