我有字典和单词:
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处停止吗?
答案 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值。