我相信用文字解释起来并不容易,但举个例子应该很清楚。
假设我有字典link_vars
和y
:
link_vars = {'v1':'AAA', 'v2':'BBB', 'v3':'CCC'}
y = {'v1':[1,2,3], 'v2':[4,5,6], 'v3':[7,8,9]}
我想建立列表desired_output
:
desired_output = [{'AAA':1 , 'BBB':4, 'CCC':7},
{'AAA':2 , 'BBB':5, 'CCC':8},
{'AAA':3 , 'BBB':6, 'CCC':9}]
因此,基本上,我想根据字典y
的条目来“翻译” link_vars
中的键,然后将y
中的列表拆分为小词典以进行构建desired_output
。 y
和link_vars
的键将始终相同,并且y
的值中每个列表的长度也将相同(即,不会有带有4个元素,另一个包含5个元素。)
我无法想到执行此操作的明智方法。我希望有一种有效的方法,因为输出列表的长度(与y
值中每个列表的长度相同)可以很大。
答案 0 :(得分:3)
这是将两个词典链接在一起的解决方案:
from operator import itemgetter
keys = itemgetter(*y)(link_vars)
res = [dict(zip(keys, v)) for v in zip(*y.values())]
[{'AAA': 1, 'BBB': 4, 'CCC': 7},
{'AAA': 2, 'BBB': 5, 'CCC': 8},
{'AAA': 3, 'BBB': 6, 'CCC': 9}]
说明
keys
,以与link_vars
中的键一致的顺序从y
中提取值。zip
和keys
预先转换为y.values()
。我们假设y.values()
与y.keys()
一致地迭代,这在Python 2.x和3.x中是正确的。答案 1 :(得分:2)
那好吧。在这种情况下,应该进行列表理解:
output = [dict(zip(link_vars.values(),i)) for i in zip(*y.values())]
print(output)
返回:
[{'AAA': 1, 'BBB': 4, 'CCC': 7},
{'AAA': 2, 'BBB': 5, 'CCC': 8},
{'AAA': 3, 'BBB': 6, 'CCC': 9}]
考虑jpps注释,也许更合适的方法是首先通过将字典合并在一起来确保获得正确的值。
temp_d = {v:y.get(k) for k,v in link_vars.items()}
output = [dict(zip(temp_d.keys(),i)) for i in zip(*temp_d.values())]
或者使用pandas库可能会过时,但是语法易于理解,因为我们只需要合并字典并使用to_dict()
func处理其余字典即可。
import pandas as pd
output = pd.DataFrame({v:y.get(k) for k,v in link_vars.items()}).to_dict('r')
说明
此处的关键思想是将y的值压缩在一起。这是通过zip(*y.values())
完成的。然后运行列表推导:[i for i in zip(*y.values())]
等于[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
,其余部分是用AAA,BBB,CCC
将每个组件压缩在一起。