2012-07-04 2 views
0

У меня возникла проблема с реализацией функции.Выполнение функции

Цель состоит в том, чтобы уменьшить значение ключа в словарной руке, если оно находится в слове. Например:

word = hi 
hand = {'h':2,'i':1} 

-> функция update_hand (слово, рука)

hand = {'h'1} 

поэтому я попытался:

def update_hand(hand, word): 
    for letter in range(len(word)): 
     if hand.get(word[letter],0) != 0: 
      hand[word[letter]] -= 1 
      if hand.get(word[letter],0) == 0: 
       del hand[word[letter]] 
    return hand 

но когда я называю его, я получаю:

Traceback (most recent call last): 
File "/home/phillip/Desktop/ps3/ps3/ps3a.py", line 168, in <module> 
print update_hand('quali', {'a': 1, 'i': 1, 'm': 1, 'l': 2, 'q': 1, 'u': 1}) 
File "/home/phillip/Desktop/ps3/ps3/ps3a.py", line 162, in update_hand 
if hand.get(word[letter],0) != 0: 
AttributeError: 'str' object has no attribute 'get' 

Итак, я попытался реализовать это в тестовом файле (просто для лута), и все работает отлично ... ну, я не знаю, что я сделал не так.

Спасибо, Phillip

+0

Там нет необходимости делать это неудобно для письма в диапазоне (LEN (слово)): , слово [письмо] материал. Просто перебирайте строку напрямую. – Antimony

ответ

1
from collections import Counter 

hand = Counter() 

def update_hand(word, hand): 
    for token in word: 
     if hand[token] == 0: 
      del hand[token] 
     else: 
      hand[token] -= 1 

Использование collections.Counter делает эту задачу тривиальной

1

И действительно ответить на вопрос: вы определили свою функцию def update_hand(hand, word), но вы, очевидно, назвать его как update_hand(word, hand). И dict, и str являются итерабельными и значимыми, но str не имеет метода get.

быстрый и простой способ отладки такой проблемы: добавить операторы печати в вашем коде, а именно:

def update_hand(hand, word): 
    print "update_hand(%s, %s)" % (hand, word) 
    # code here 

и не забудьте удалить оператор печати, как только вы исправили проблему.

Также как упоминалось в Сурьме, вам не нужно уродливое индексирование. Jakob разместил аккуратную версию с помощью collections.Counter, но если вы застряли со старым (< 2.7.x) версия Python здесь более канонической реализация:

def update_hand(hand, word): 
    for letter in word: 
     count = hand.get(letter, 0) 
     if count > 1: 
      # avoids a KeyError if letter was not in hand 
      # XXX spec : should this happen ? 
      hand[letter] = count - 1 
     else: 
      # count is already <= 1 so decreasing it would make it <= 0 
      del hand[letter] 

    return hand 
Смежные вопросы