将两个词典的信息翻译成词典列表

时间:2018-10-16 19:59:11

标签: python list dictionary

我相信用文字解释起来并不容易,但举个例子应该很清楚。

假设我有字典link_varsy

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_outputylink_vars的键将始终相同,并且y的值中每个列表的长度也将相同(即,不会有带有4个元素,另一个包含5个元素。)

我无法想到执行此操作的明智方法。我希望有一种有效的方法,因为输出列表的长度(与y值中每个列表的长度相同)可以很大。

2 个答案:

答案 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}]

说明

  1. 首先,定义keys,以与link_vars中的键一致的顺序从y中提取值。
  2. 第二,使用列表推导,将zipkeys预先转换为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将每个组件压缩在一起。