我遇到了函数实现的问题。
目的是减少字典中的键的值(如果它在单词中)。 例如:
word = hi
hand = {'h':2,'i':1}
- > function update_hand(word,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'
所以我试着在测试文件中实现它(只是用于抢劫)并且一切正常......好吧,我不知道我做错了什么。
谢谢, 菲利普
答案 0 :(得分: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 :(得分:1)
并且真的回答了这个问题:您将自己的功能定义为def update_hand(hand, word)
,但您显然将其称为update_hand(word, hand)
。 dict和str都是可迭代的,并且相当大,但str没有get
方法。
调试此类问题的快速而简单的方法:在代码中添加print语句,即:
def update_hand(hand, word):
print "update_hand(%s, %s)" % (hand, word)
# code here
并且在解决问题后不要忘记删除print语句。
同样,锑提到你不需要丑陋的索引。雅各布使用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