检查手是否包含单词中字母的循环如下所示。
hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
extra_hand = hand.copy()
for letter in word:
extra_hand[letter] -= 1
>> extra_hand
{'h': 0, 'e': 0, 'l': 0, 'o': 0}
然后,我尝试转换为字典理解。它应该看起来像这样。
hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
extra_hand = {letter:hand[letter] - 1 for letter in word}
>>extra_hand
{'h': 0, 'e': 0, 'l': 1, 'o': 0}
如您所见,结果不同,l 为 1,这是不正确的。我怀疑“l”是从没有突变的手字典对象中派生出来的。所以,它只是做了两次 2-1 并变成了 1,而不是 2-1 和 1-1。
请问我应该怎么做才能解决字典理解问题?
请您参考如下方法:
不能以这种递归方式使用字典理解。它无法在 word 迭代时持续更新项目。
另一种思考方式是,在整个理解完成之前,字典的键和值不可用于操作。
您可以将字典理解视为复制下面的 for 循环。与 for 循环一样,您将设置值而不是添加到先前分配给键的值。
for letter in word:
extra_hand['letter'] = hand['letter'] - 1
您的循环非常好,无需使用字典理解。
作为替代方案,如果您只想计算非零计数,您可以使用 collections.Counter:
from collections import Counter
hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
res = Counter(hand) - Counter(word)
# Counter()
hand = {'h': 1, 'e': 2, 'l': 2, 'o': 1}
word = 'hello'
res = Counter(hand) - Counter(word)
# Counter({'e': 1})
