使用字典理解来使用 setdefault() 的替代方法?
Alternative way to use setdefault() using dictionary comprehension?
我有一个嵌套字典,它是从嵌套列表创建的,其中嵌套列表中的第一项是外部键,外部值是字典,即接下来的两项。以下代码使用两个 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}}
我实际上试图达到那个结果但失败了。
理解会覆盖新条目。
之后,看了这个想法,我发现了一个类似的post,其中说明这是不可能的:
我相信 Amber 的回答最好地总结了我对 dict 理解的尝试失败的结论:
No - dict comprehensions are designed to generate non-overlapping keys with each iteration; they don't support aggregation. For this particular use case, a loop is the proper way to accomplish the task efficiently (in linear time)
使用循环,因为它的可读性和效率很高。并非所有代码都必须是 one-liner.
话虽如此,这是可能的。它滥用语法,极其不可读,效率低下,通常只是普通的错误代码(不要这样做!)
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}}
我有一个嵌套字典,它是从嵌套列表创建的,其中嵌套列表中的第一项是外部键,外部值是字典,即接下来的两项。以下代码使用两个 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}}
我实际上试图达到那个结果但失败了。
理解会覆盖新条目。
之后,看了这个想法,我发现了一个类似的post,其中说明这是不可能的:
我相信 Amber 的回答最好地总结了我对 dict 理解的尝试失败的结论:
No - dict comprehensions are designed to generate non-overlapping keys with each iteration; they don't support aggregation. For this particular use case, a loop is the proper way to accomplish the task efficiently (in linear time)
使用循环,因为它的可读性和效率很高。并非所有代码都必须是 one-liner.
话虽如此,这是可能的。它滥用语法,极其不可读,效率低下,通常只是普通的错误代码(不要这样做!)
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}}