python - 为什么dict.get(key)起作用,但dict[key]不起作用?




dictionary (2)

这是对dict的 fromkeys 方法的帮助。

关于内置功能fromkeys的帮助:

Builtins.type实例的fromkeys(iterable,value = None,/)方法使用来自iterable的键并将值设置为value创建一个新字典

那就是说fromkeys会接受一个值,即使它是一个可调用的,它也会先对其求值,然后将该值分配给所有dict键。

列表在Python中是可变的,因此它将分配相同的空列表引用,并且一项更改将影响所有列表。

改用defaultdict:

>>> from collections import defaultdict
>>> one_groups = defaultdict(list)
>>> for x in binaries:
      one_groups[x.count('1')] += [x]
>>> one_groups = dict(one_groups) # to stop default dict behavior

这将接受对不存在的键的分配,并且值将默认为空列表(在这种情况下)。

我正在尝试根据字符串中有1的数目将某些数字的二进制字符串组合在一起。

这不起作用:

s = "0 1 3 7 8 9 11 15"
numbers = map(int, s.split())
binaries = [bin(x)[2:].rjust(4, '0') for x in numbers]

one_groups = dict.fromkeys(range(5), [])
for x in binaries:
    one_groups[x.count('1')] += [x]

预期的字典 one_groups 必须为

{0: ['0000'], 
 1: ['0001', '1000'], 
 2: ['0011', '1001'], 
 3: ['0111', '1011'], 
 4: ['1111']}

但是我明白了

{0: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 1: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 2: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 3: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111'], 
 4: ['0000', '0001', '0011', '0111', '1000', '1001', '1011', '1111']}

到目前为止,唯一起作用的是如果我使用 one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x] 而不是 one_groups[x.count('1')] += [x]

但是为什么会这样呢? 如果我没 dict[key] 话, dict[key] 是否不应该返回字典的值,类似于 dict.get(key) 工作方式吗? 我看过这个线程, 为什么用dict.get(key)而不是dict [key]? 但对于这种特殊情况,它没有回答我的问题,因为我确定该程序不是要获取 KeyError

我也尝试过 one_groups[x.count('1')].append(x) 但这也不起作用。


问题是使用 one_groups = dict.fromkeys(range(5), [])

(这会将与值相同的列表传递给所有键。因此,如果更改一个值,则全部更改)

您可以改用此方法: one_groups = {i:[] for i in range(5)}

(此操作将为每个键“执行” [](等于list()),从而使值具有不同的列表。)





dictionary