递减键值列表的值
我有一个包含键值对的列表,每个键都有一个整数值...
这些整数值代表某个手牌中字母的数量...
比如,这里有一手牌 -
hand = {'a':1, 'q':1, 'l':2, 'm':1, 'u':1, 'i':1}
displayHand(hand) # Implemented for you
a q l l m u i
hand = updateHand(hand, 'quail') # You implement this function!
hand
{'l': 1, 'm': 1}
displayHand(hand)
l m
在这个例子中 - 这个调用 -
updateHand({'a': 1, 'i': 1, 'm': 1, 'l': 2, 'q': 1, 'u': 1}, quail)
应该得到这个输出 -
{'a': 0, 'q': 0, 'u': 0, 'i': 0, 'm': 1, 'l': 1}
注意到“quail”这个词中的字母都减少了一吗?
那么,如果值大于零,我该如何将这些键的值减去一呢?
这是我目前写的代码 -
for c in word:
if c in hand:
x = int(hand.get(c))
x -= 1
return hand
2 个回答
好吧……在我们还不懂这门语言的时候,我就费了不少劲去做了这个,所以我干脆把它发出来吧。这是JavaScript的代码。不知道里面有多少内容可以用Python来实现,但大致上能传达我想说的意思,后面还有一个可以运行的示例链接供你查看。
注意,要使用一个打开了JavaScript控制台的浏览器才能看到输出结果。
var hand = {a:1, q:1, l:2, m:1, u:1, i:1},
quail = 'quail';
displayHand(hand);
hand = updateHand(hand, quail);
displayHand(hand);
function displayHand(obj) {
var log = '',
key;
for (key in obj) {
if (obj.hasOwnProperty(key) && obj[key]) {
log += key;
}
}
console.log(log.split('').join(' ') || 'Nothing');
}
function updateHand(obj, tokens) {
var pos = 0,
token;
while (token = tokens[pos++]) {
if (obj.hasOwnProperty(token) && obj[token] > 0) {
obj[token]--;
}
}
return obj;
}
这是你的代码:
def updateHand(hand, word):
for c in word:
if c in hand:
x = int(hand.get(c))
x -= 1
return hand
但是这段代码并没有对 hand
产生任何影响。为什么呢?因为尝试改变的那一行是 x -= 1
。这行代码只是改变了 x
的值,而你刚刚把 x
定义为 int(hand.get(c))
。在 Python 中,这意味着如果 hand
中 c
的值是 2
,那么 x
就会被设置为 2
。但是,改变 x
并不会改变 hand
中 c
的值。相反,你需要做一些不同的事情:
def updateHand(hand, word):
for c in word:
if c in hand:
hand[c] -= 1
return hand
在这个特定情况下,这并不重要,但这个函数实际上会修改输入的 hand
,然后返回同样的内容。例如:
>>> hand = {'a': 1, 'i': 1, 'm': 1, 'l': 2, 'q': 1, 'u': 1}
>>> new_hand = updateHand(hand, 'quail')
>>> new_hand
{'l': 1, 'm': 1}
>>> hand
{'l': 1, 'm': 1}
通常来说,你可能希望 updateHand
返回一个新的字典,而不去改变旧的那个,或者让它不返回任何东西,只修改输入的参数。看起来你得到了这段代码:
hand = updateHand(hand, 'quail')
你应该选择前者。实现这个的一个方法是在 updateHand
的第一行添加 hand = hand.copy()
;这样就能保留旧的字典不变。
现在,另一个问题是你的代码在输出中放入了值为 0
的项,如果它们原本是 1
,但你的赋值中根本没有包含这些项。我留给你去想想怎么处理这种情况,不过给你一个提示:你可以通过 del hand[c]
语句从字典中删除项。
虽然不推荐你这样做,但顺便提一下,给 @Jared 展示一下 Python 的一些特性: :)
def updateHand(hand, word):
return collections.Counter(hand) - collections.Counter(word)
(将返回值用 dict
包裹起来,以使其完全符合所需的接口)