使用字典理解使用setdefault()的替代方法



我有一个嵌套字典,它是从嵌套列表创建的,其中嵌套列表中的第一项将是外键,外部值将是一个字典,该字典是接下来的两项。下面的代码使用两个setdefault()函数工作得很好,因为它只是在看到外部的重复键时添加到嵌套字典中。我只是想知道你怎么能用字典理解来做同样的逻辑?

dict1 = {}
list1 = [[1, 2, 6],
[1, 3, 7],
[2, 5, 8],
[2, 8, 9]]

for i in list1:
dict1.setdefault(i[0], {}).setdefault(i[1], i[2])

输出:

{1: {2: 6, 3: 7}, 2: {5: 8, 8: 9}}

使用循环,因为它可读性强,效率高。并非所有代码都必须是一行代码。

话虽如此,这是可能的。它滥用语法,极不可读,效率低下,通常只是简单的坏代码(不要这么做!(

out = {k: next(gg for gg in [{}] if all(gg.setdefault(a, b) for a,b in v)) for k, v in next(g for g in [{}] if not any(g.setdefault(key, []).append(v) for key, *v in list1)).items()}

输出:

{1: {2: 6, 3: 7}, 2: {5: 8, 8: 9}}

我实际上试图实现这个结果,但失败了
理解覆盖了新条目

之后,我看了一下这个想法,发现了一个类似的帖子,其中指出这是不可能的:
https://stackoverflow.com/questions/11276473/append-to-a-dict-of-lists-with-a-dict-comprehension

我相信Amber的回答最好地概括了我对dict理解的失败尝试的结论:

无dict理解被设计为在每次迭代中生成不重叠的密钥;它们不支持聚合。对于这个特定的用例,循环是有效地(在线性时间内(完成任务的正确方式

最新更新