递减键值列表的值

0 投票
2 回答
3986 浏览
提问于 2025-04-17 18:28

我有一个包含键值对的列表,每个键都有一个整数值...

这些整数值代表某个手牌中字母的数量...

比如,这里有一手牌 -

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 个回答

0

好吧……在我们还不懂这门语言的时候,我就费了不少劲去做了这个,所以我干脆把它发出来吧。这是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;
}

http://jsfiddle.net/userdude/ybrn4/

1

这是你的代码:

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 中,这意味着如果 handc 的值是 2,那么 x 就会被设置为 2。但是,改变 x 并不会改变 handc 的值。相反,你需要做一些不同的事情:

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 包裹起来,以使其完全符合所需的接口)

撰写回答