使用-=时,字典值未按预期更新

时间:2018-08-09 16:20:32

标签: python string python-2.7 dictionary counter

我有字典和单词:

check = {'a': 3, 'e': 1, 'p': 2, 'r': 1, 'u': 1, 't': 1}
word = 'rapturerererer'

如果来自word的所有字母都在check中,我希望进行测试。因此,我需要对所有用完的字母进行连续计数,并检查最后是否有底片。

我有代码,但是它始终将值的上限设为0,并且从不返回负值:

for letter in word:
    if check.get(letter):
        check[letter] -= 1
print(check)

{'a': 2, 'p': 1, 'r': 0, 'e': 0, 't': 0, 'u': 0}

我期望的是:

{'a': 2, 'p': 1, 'r': -5, 'e': -4, 't': 0, 'u': 0}

有人能解释为什么这些值在0处停止吗?

2 个答案:

答案 0 :(得分:7)

if check.get(letter):
    check[letter] -= 1

if check.get(letter)不仅会在缺少letter的情况下失败;如果字典中的值为"falsy",它也会失败。 None是虚假的,0也是虚假的。一旦达到0,测试就会失败,并且不会再进行递减操作。

改为使用in

if letter in check:
    check[letter] -= 1

答案 1 :(得分:2)

发生错误是因为检查if d.get(x)会评估值的性质(即,它是0还是类似False)而不是只是存在密钥。

一种替代方法是使用collections.Counter,然后使用字典理解:

from collections import Counter

check = {'a': 3, 'e': 1, 'p': 2, 'r': 1, 'u': 1, 't': 1}
word = 'rapturerererer'

word_count = Counter(word)

res = {k: check[k] - word_count[k] for k in check}

print(res)

{'a': 2, 'e': -3, 'p': 1, 'r': -5, 'u': 0, 't': 0}

这将起作用,因为Counter对象为尚未添加的键返回0值。