【问题标题】:decrement value of a key list键列表的递减值
【发布时间】:2026-01-10 16:05:02
【问题描述】:

我有一个键列表:带有附加到特定键的整数值的值...

这些整数值表示特定手牌中的字母数...

例如,这是一只手 -

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

【问题讨论】:

  • 请将语言添加为标签。
  • 并展示您尝试过的内容。我们不是来帮你做功课的。
  • 这看起来像简单的替换加密和 Javascript。排序已经。无论如何,从功能意义上讲,您只需获取输入对象并将输入值标记化以逐个标记在该对象上移动,然后在标记列表中移动,减少它在对象中的关联值。然后返回。但是,如何做到这一点在一定程度上取决于语言。
  • 语言是python....
  • 实际上,看起来他正在实施拼字游戏。 hand 是他的牌,"quail" 是他刚刚玩的字。

标签: python key decrement


【解决方案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 的值,您刚刚将其定义为int(hand.get(c))。在 Python 中,这意味着如果 hand 对于 c 的值为 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')

你应该做这两个中的第一个。实现此目的的一种方法是将hand = hand.copy() 添加为updateHand 的第一行;那么它就会不理会旧的。


现在,另一件事是您的代码会将 0 值放入输出中(如果它们曾经是 1),但您的分配根本不包括它们。我会让你弄清楚如何处理这种情况,但作为一种方法的提示:你可以通过语句 del hand[c] 从字典中删除项目。


不建议你这样做,但作为 @Jared 展示 Python 一点点的旁白::)

def updateHand(hand, word):
    return collections.Counter(hand) - collections.Counter(word)

(将返回值包装在对dict 的调用中,使其完全符合所需的接口)

【讨论】:

  • 这使得 Javascript 看起来非常健谈。但是,这不会将值降低到 0 以下吗?这可能不是故意的,但那是我收集到的。
  • 如果有return hand.reduce(by)这样的东西会更酷。
【解决方案2】:

嗯...在我们了解该语言之前,我遇到了麻烦,所以我不妨发布它,但它是 Javascript。不知道其中有多少可能是 Pythonizable©,但它给出了我评论的要点,并且有一个工作小提琴可供查看。

注意,请使用带有打开的 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/

【讨论】: