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

我正在尝试根据字符串中存在的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.get(key)的工作方式?
我已经看到了该线程Why dict.get(key) instead of dict[key]?,但是对于这种特殊情况,它没有回答我的问题,因为我确定该程序并非要获取KeyError

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

python大神给出的解决方案

问题是可变性:

one_groups = dict.fromkeys(range(5), [])-这会将与值相同的列表传递给所有键。因此,如果更改一个值,则全部更改。

基本上与说相同:

tmp = []
one_groups = dict.fromkeys(range(5), tmp)
del tmp

如果要使用新列表,则需要循环执行-显式for循环或dict理解中:

one_groups = {key: [] for key in range(5)}

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

get为什么起作用?因为您显式获取当前列表,但+会创建新的结果列表。不管是one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x]还是one_groups[x.count('1')] = one_groups[x.count('1')] + [x]-重要的是存在+

我知道每个人都说a+=b只是a=a+b,但是实现优化的方式可能有所不同-在列表的情况下,+=只是.extend,因为我们知道我们希望将结果保存在当前变量中,因此创建新列表将浪费内存。

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

不带括号的调用函数的目的python - python

考虑以下:class objectTest(): def __init__(self,a): self.value = a def get_value(self): return self.value class execute(): def __init__(self): a = objectTest(1) b = objectTest(1) print(…

Python:同时在for循环中添加到列表列表 - python

我想用for循环外的0索引值创建一个新列表,然后使用for循环添加到相同的列表。我的玩具示例是:import random data = ['t1', 't2', 't3'] masterlist = [['col1', 'animal1', 'an…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何获取Python中所有内置函数的列表 - python

当我们从中获取关键字列表时,如何从Python提示符中获取Python中所有内置函数的列表? python大神给出的解决方案 更新:关于__builtins__或__builtin__可能会有一些混淆。What’s New In Python 3.0建议使用builtins 将模块__builtin__重命名为builtins(删除下划线, 添加一个“ s”…