从元组列表创建嵌套字典的快速方法,无需for循环



我知道以前也有人问过类似的问题,但我找不到合适的答案来解决我的问题。

假设我有以下元组列表:

d = [('first', 1), ('second', 2), ('third', 3)]

我可以很容易地将其转换为字典:

dict(d)
# {'first': 1, 'second': 2, 'third': 3}

现在,如果我有以下元组列表:

d = [('a', 'first', 1), ('a', 'second', 2), ('b', 'third', 3)]

如何最有效地获得以下嵌套字典:

{'a': {'first': 1, 'second': 2}, 'b': {'third': 3}}

这是我现在的解决方案:

from collections import defaultdict
dd = defaultdict(dict)
for a, b, c in d:
dd[a][b] = c
# defaultdict(dict, {'a': {'first': 1, 'second': 2}, 'b': {'third': 3}})

这是最具表演性的方式吗?有可能避免for循环吗?我可能不得不处理d非常大的情况,并且这种方法可能不能很好地扩展。这一部分对于我正在构建的web应用程序至关重要,这就是为什么性能非常重要的原因。

欢迎输入/反馈/帮助!

您可以使用groupby

from itertools import groupby
result = {k:dict([(i[1],i[2]) for i in l]) for k, l in groupby(d, key=lambda x: x[0])}
# Result
{'a': {'first': 1, 'second': 2}, 'b': {'third': 3}}

当您使用groupby时,期望值使用关键字进行排序。

编辑:

使用map可以避免第二次循环。

{k:dict(map(lambda x: (x[1],x[2]), l)) for k, l in groupby(d, key=lambda x: x[0])}

最新更新