Skip to main content
 首页 » 编程设计

python之字典理解从循环中产生不同的结果

2025年05月04日22xxx_UU

检查手是否包含单词中字母的循环如下所示。

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})