2016-10-07 3 views
0

У меня есть функция, которая позволяет минимизировать количество букв в списке, если данное слово содержит эту букву. Это Защита функции:Ложная итерация по списку

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 и/или не исключает его из списка? Благодаря!

+2

'handCopy [x] = hand.get (x, 0) - 1' - внимательно рассмотрите эту строку. – user2357112

+1

Кроме того, это не список. – user2357112

+2

Потому что 'hand.get ('t')' is '2'. – melpomene

ответ

0

Рассмотрим такую ​​ситуацию:

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

поэтому у нас есть руки, как Dict. Теперь мы делаем это одно:

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 

Solution

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} 
+0

Какая глупая ошибка. Спасибо за вашу помощь! –

+0

@ MickeyMahoney конечно, проблем нет. Мы все ошибаемся. – turkus