【问题标题】:Why do I get different results iterating over dictionary为什么我在字典上迭代得到不同的结果
【发布时间】:2020-09-27 08:57:29
【问题描述】:

我有两个函数可以在拼字游戏类型的游戏中迭代字典。我不明白为什么一个不起作用,而另一个则使用测试输入。我使用 pythontutor.com 试图找出其中一个没有得到正确输出的原因。 这个函数给出正确的输出

def updateHand(hand, word):
    
    newhand = hand.copy()
    for letter in word:
        if letter in newhand.keys():
            newhand[letter] -= 1        
    return newhand
print(updateHand({'h': 1, 'e': 1, 'l': 2, 'o': 1}, 'hello'))
print(updateHand({'a': 1, 'q': 1, 'l': 2, 'm': 1, 'u': 1, 'i': 1},'quail'))

正确的输出:

{'h': 0, 'e': 0, 'l': 0, 'o': 0} 

{'a': 0, 'q': 0, 'l': 1, 'm': 1, 'u': 0, 'i': 0}

这个函数没有给出正确的输出,我想知道为什么:

def updateHand(hand, word):
    
    newhand = hand.copy()
    for letter in word:
       newhand[letter] = hand.get(letter, 0) - 1        
    return newhand

这是此函数的输出,“l”值应为零。

{'h': 0, 'e': 0, 'l': 1, 'o': 0}

【问题讨论】:

  • 我似乎得到了相同的输出。这里没有问题
  • 到达第二个lnewhand的状态是什么? hand 的状态如何?
  • 哪个python版本?
  • 最新的python.3.8 ish

标签: python dictionary iteration


【解决方案1】:

原因是handl 的计数在第二个解决方案中没有更新。

试试这个:

def updateHand(hand, word):
    
    newhand = hand.copy()
    for letter in word:
       # use newhand here
       newhand[letter] = newhand.get(letter, 0) - 1        
    return newhand

在你的代码中,只要遇到l时跟踪newhandhand的状态即可:

在第一个l之后:newhand = {'h': 0, 'e': 0, 'l': 1, 'o': 1} ,hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}

在第二个 l 之后:因为 hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1} ,所以 newhand = {'h': 0, 'e': 0, 'l': 1, 'o': 1}

关键的区别在于 newhand 中的计数被基于 hand 修改的数据覆盖。

【讨论】:

  • 所以用字母 l 它只是重复从 2 中减去一个而不是更新。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多