如何在Python中将一个字典列表转换为一个列表字典?

12

这可能是Python中的一个经典问题,但我还没有找到答案。

我有一个字典列表,这些字典具有相似的键。它看起来像这样:

 [{0: myech.MatchingResponse at 0x10d6f7fd0, 
   3: myech.MatchingResponse at 0x10d9886d0,
   6: myech.MatchingResponse at 0x10d6f7d90,
   9: myech.MatchingResponse at 0x10d988ad0},
  {0: myech.MatchingResponse at 0x10d6f7b10,
   3: myech.MatchingResponse at 0x10d6f7f90>}]

我想要一个新字典,其中[0,3,6,9]作为键,"myech.MatchingResponse"列表作为值。

当然,我可以使用简单的循环来实现这一点,但我想知道是否有更高效的解决方案。


对于从字典列表到字典列表的反向转换,请参见:https://dev59.com/xHI-5IYBdhLWcg3wlpaW - 0 _
相关链接:https://dev59.com/Tl0a5IYBdhLWcg3wRW2V - 0 _
4个回答

19
import collections

result = collections.defaultdict(list)

for d in dictionaries:
    for k, v in d.items():
        result[k].append(v)

1
这个非常慢! - salomonvh

2

假设你的列表被赋值给名为mylist的变量。

mydic = {}
for dic in mylist:
    for key, value in dic.items():
        if key in mydic:
            mydic[key].append(value)
        else:
            mydic[key] = [value]

4
иҜ·дҪҝз”Ёdict.setdefaultжҲ–иҖ…collections.defaultdictд»ЈжӣҝиҝҷдёӘпјҒ :D - jamylak
同时这个方法不可行,因为遍历字典时只会遍历它的键,所以 for key, value in dic 会报错。请改为 for key, value in dic.items()。编辑:我已经为您修改了。 - jamylak
为什么使用 dic = {} 来初始化字典是如此错误的? - lizzie
1
@lizzie,我认为这没什么问题。只是不要把它命名为dict,否则你会遮蔽内置的dict类,因为你的变量已经使用了这个名称,所以你将无法访问它。 - jamylak
听起来很奇怪,一个变量屏蔽了它自己的类型 :p - bigblind

2

使用字典推导式也可以完成这个操作...可以写成一行,但为了清晰起见,我将其分为两行。 :)

from itertools import chain

all_keys = set(chain(*[x.keys() for x in dd]))
print {k : [d[k] for d in dd if k in d] for k in all_keys}

结果为:

{0: ['a', 'x'], 9: ['d'], 3: ['b', 'y'], 6: ['c']}

这不是提问者想要的。 - Otto Allmendinger
@OttoAllmendinger 啊..我误解了问题...请看修正后的解决方案 :) - Maria Zverina
我不确定性能如何,但现在它是一个有效的答案。 - Otto Allmendinger

0
如果你有一个字典列表,每个字典中的键都相同,你可以像下面这个例子一样将它们转换为列表字典(有些人认为这种方式比其他答案更符合 Python 风格)。
d = []
d.append({'a':1,'b':2})
d.append({'a':4,'b':3}) 
print(d)                                                               
[{'a': 1, 'b': 2}, {'a': 4, 'b': 3}]

newdict = {}
for k,v in d[0].items():
    newdict[k] = [x[k] for x in d]

print(newdict)
{'a': [1, 4], 'b': [2, 3]}

如果您有一组具有相同键的字典列表。但这并不是实际提出的问题,因此这是对不同问题的回答?我建议一个更短的答案; “42”,这也是对不同问题的答案。 - MatBailie

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