在 Python 中的字典中添加缺失的键

Pol*_*lly 4 python dictionary key

我有一个字典列表:

L = [{0:1,1:7,2:3,4:8},{0:3,2:6},{1:2,4:6}....{0:2,3:2}]. 
Run Code Online (Sandbox Code Playgroud)

如您所见,字典的长度不同。我需要的是将缺失的键:值添加到每个字典中,使它们具有相同的长度:

L1 = [{0:1,1:7,2:3,4:8},{0:3,1:0,2:6,3:0,4:0},{0:0, 1:2,3:0,4:6}....{0:2,1:0,2:0,3:2,4:0}], 
Run Code Online (Sandbox Code Playgroud)

表示为缺失值添加零。最大长度没有预先给出,所以只有遍历列表才能得到它。

我试图用 defaultdicts 做一些事情,L1 = defaultdict(L)但似乎我不明白它是如何工作的。

Mar*_*ers 6

您必须进行两次传递:1 次获得所有键的并集,另一次是添加缺少的键:

max_key = max(max(d) for d in L)
empty = dict.fromkeys(range(max_key + 1), 0)
L1 = [dict(empty, **d) for d in L]
Run Code Online (Sandbox Code Playgroud)

这使用“空”字典作为基础来快速生成所有键;该词典的新副本加上原始词典会产生您想要的输出。

请注意,这假设您的密钥始终是连续的。如果不是,您可以生成所有现有键的并集:

empty = dict.fromkeys(set().union(*L), 0)
L1 = [dict(empty, **d) for d in L]
Run Code Online (Sandbox Code Playgroud)

演示:

>>> L = [{0: 1, 1: 7, 2: 3, 4: 8}, {0: 3, 2: 6}, {1: 2, 4: 6}, {0: 2, 3: 2}]
>>> max_key = max(max(d) for d in L)
>>> empty = dict.fromkeys(range(max_key + 1), 0)
>>> [dict(empty, **d) for d in L]
[{0: 1, 1: 7, 2: 3, 3: 0, 4: 8}, {0: 3, 1: 0, 2: 6, 3: 0, 4: 0}, {0: 0, 1: 2, 2: 0, 3: 0, 4: 6}, {0: 2, 1: 0, 2: 0, 3: 2, 4: 0}]
Run Code Online (Sandbox Code Playgroud)

或 set 方法:

>>> empty = dict.fromkeys(set().union(*L), 0)
>>> [dict(empty, **d) for d in L]
[{0: 1, 1: 7, 2: 3, 3: 0, 4: 8}, {0: 3, 1: 0, 2: 6, 3: 0, 4: 0}, {0: 0, 1: 2, 2: 0, 3: 0, 4: 6}, {0: 2, 1: 0, 2: 0, 3: 2, 4: 0}]
Run Code Online (Sandbox Code Playgroud)

上述将两个字典合并为一个新字典的方法dict(d1, **d2)在 Python 2 中始终有效。在 Python 3 中,已经对可以使用此技巧的键类型设置了额外的约束;第二个字典只允许字符串键。对于这个例子,如果你有数字键,你可以使用它们的字典视图的联合来代替:

dict(d.items() | empty.items())  # Python 3 dictionary merge
Run Code Online (Sandbox Code Playgroud)


Ayu*_*ush 3

小心一点:改变L

>>> allkeys = frozenset().union(*L)
>>> for i in L:
...    for j in allkeys:
...        if j not in i:
...            i[j]=0

>>> L
[{0: 1, 1: 7, 2: 3, 3: 0, 4: 8}, {0: 3, 1: 0, 2: 6, 3: 0, 4: 0}, {0: 0, 1: 2, 2:
 0, 3: 0, 4: 6}, {0: 2, 1: 0, 2: 0, 3: 2, 4: 0}]
Run Code Online (Sandbox Code Playgroud)