对列表进行虚假迭代

时间:2016-10-07 21:07:46

标签: python list dictionary iteration

我有一个函数,假设给定单词包含该字母,则最小化列表中字母的数量。这是函数的def:

word = 'better'
hand = {'b':1, 'r':1, 's':3, 't':2, 'z':1, 'e':3}
def updateHand(hand, word):
    handCopy = hand.copy()
    for x in word:
        print(x)
        print(hand)
        handCopy[x] = hand.get(x,0) - 1
        print(handCopy)
    return handCopy

这就是输出:

b
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 2, 'r': 1, 'e': 3}
e
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 2, 'r': 1, 'e': 2}
t
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 1, 'r': 1, 'e': 2}
t
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 1, 'r': 1, 'e': 2}
e
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 1, 'r': 1, 'e': 2}
r
{'s': 3, 'b': 1, 'z': 1, 't': 2, 'r': 1, 'e': 3}
{'s': 3, 'b': 0, 'z': 1, 't': 1, 'r': 0, 'e': 2}
Out[110]: {'b': 0, 'e': 2, 'r': 0, 's': 3, 't': 1, 'z': 1}

为什么我的功能会跳过第二个t和/或不会从列表中删除它?谢谢!

1 个答案:

答案 0 :(得分:0)

让我们考虑一下这种情况:

hand = {'b':1, 'r':1, 's':3, 't':2, 'z':1, 'e':3}

所以我们把手作为一个词。现在我们这样做:

x = hand.get('t',0) - 1
print x

结果将是1.让我们再做一次:

x = hand.get('t',0) - 1
print x

再次1.为什么?因为您没有更新手中词典't'键的值。所以它与您的代码中的情况相同:

handCopy[x] = hand.get(x,0) - 1

所以你应该这样做:

handCopy[x] = handCopy.get(x, 0) - 1

<强>解决方案

word = 'better'
hand = {'b':1, 'r':1, 's':3, 't':2, 'z':1, 'e':3}
def updateHand(hand, word):
    handCopy = hand.copy()
    for x in word:         
        print(x)           
        print(hand)        
        handCopy[x] = handCopy.get(x,0) - 1
        print(handCopy)    
    return handCopy

结果:

b
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 3, 't': 2, 'r': 1, 'z': 1}
e
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 2, 't': 2, 'r': 1, 'z': 1}
t
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 2, 't': 1, 'r': 1, 'z': 1}
t
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 2, 't': 0, 'r': 1, 'z': 1}
e
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 1, 't': 0, 'r': 1, 'z': 1}
r
{'b': 1, 'e': 3, 's': 3, 'r': 1, 't': 2, 'z': 1}
{'s': 3, 'b': 0, 'e': 1, 't': 0, 'r': 0, 'z': 1}
Out[110]: {'s': 3, 'b': 0, 'e': 1, 't': 0, 'r': 0, 'z': 1}