为什么dict.获取(key)工作而不是dict[key]?

2024-04-24 23:58:39 发布

您现在位置: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必须是

^{pr2}$

但我知道

{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']}

{{cd2}的用法只有在

但为什么会这样呢?如果我没记错的话,dict[key]不是应该返回字典的值,类似于dict.get(key)的工作方式吗? 我见过这个线程Why dict.get(key) instead of dict[key]?,但它没有回答我在这个特定情况下的问题,因为我确信这个程序不是要得到KeyError

我也试过one_groups[x.count('1')].append(x),但这也没用。在


Tags: key字符串inmapforget字典count
1条回答
网友
1楼 · 发布于 2024-04-24 23:58:39

问题是易变性:

one_groups = dict.fromkeys(range(5), [])-这会将与value相同的列表传递给所有键。所以如果你改变一个值,你就改变了所有的值。在

基本上和说:

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

如果您想使用一个新列表,您需要在一个循环中执行该操作—要么是显式的for循环,要么是在dict理解中:

^{2}$

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


为什么get起作用?因为您显式地获取当前列表,但是+生成一个新的结果列表。不管是one_groups[x.count('1')] = one_groups.get(x.count('1')) + [x]还是{},重要的是有{}。在

我知道大家怎么说a+=b只是a=a+b,但是优化的实现可能不同-在列表的情况下,+=只是{},因为我们知道我们希望结果在当前变量中,所以创建新的list会浪费内存。在

相关问题 更多 >