说我有一个三元组的列表,我想要一个函数将它们添加到一个嵌套的字典中,该字典的深度为两层,例如:
lst = [('Watermelon', 200, (1,4)), ('Apple', 100, (2, 23)), ('Apple', 120, (1, 33))]
而且我想返回看起来像是的字典f:
f = {'Watermelon': {(1,4): 200}, 'Apple': {(2, 23): 100, (1, 33): 120 }}
这将起作用。不需要导入并且比理解类型的语法更具可读性。
dictionary = {}
for a, b, c in lst:
if a not in dictionary.keys():
dictionary[a] = {}
dictionary[a][c] = b
同意DavidBurke。理解确实是直观且可读的。但是,它们不应走得太远。 ;)
致MarianD:我不确定in dict
或in dict.keys()
哪个更好。
随时进行更正。这个答案已经到了最重要的位置,因此不要误导。
import collections as co
dd = co.defaultdict(dict)
for item in lst:
dd[item[0]].update({item[2]:item[1]})
结果:
In [31]: dd
Out[31]:
defaultdict(dict,
{'Watermelon': {(1, 4): 200},
'Apple': {(2, 23): 100, (1, 33): 120}})
最简单的语法:
{a: {c: b} for a, b, c in lst}
这是一个字典生成,它为列表中的每个项目输出a: {c: b}
,并按a, b, c
的顺序将其拆包。
这并不能完全满足您的需要,因为您有想要转换为列表的公用密钥。其他答案可以做到,尽管现在和现在都不够优雅。我将其留在这里以帮助任何未来的Googler,他们对您的要求都不尽相同。
from collections import defaultdict
keys = [name for name, *_ in lst]
vals = [pair for _, *pair in lst]
f = defaultdict(dict)
for key, val in zip(keys, vals):
f[key].update({val[1]: val[0]})
结果:
defaultdict(dict, {'Watermelon': {(1, 4): 200}, 'Apple': {(2, 23): 100, (1, 33): 120}})