递减键列表的值

时间:2013-03-09 00:12:35

标签: python key decrement

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

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

例如,这是一只手 -

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}

注意鹌鹑这个词中的字母是如何减少的?

那么如果密钥的值大于零,如何通过将密钥值减1来更改密钥的值?

这是我到目前为止的代码 -

for c in word:

    if c in hand:
        x = int(hand.get(c))
        x -= 1

return hand

2 个答案:

答案 0 :(得分: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的{​​{1}}值为2,则您将设置c。但意味着更改x = 2会更改xc的值。相反,你需要做一些不同的事情:

hand

在这种特殊情况下无关紧要,但此函数实际上修改了输入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值放入输出中,如果它们曾经是1,但你的赋值根本就不包括它们。我将让你弄清楚如何处理这种情况,但作为一种方法的提示:你可以通过语句0从字典中删除项目。


不建议你这样做,但作为@Jared的一小部分来展示Python::)

del hand[c]

(在调用def updateHand(hand, word): return collections.Counter(hand) - collections.Counter(word) 时包装返回值以使其完全符合所需的接口)

答案 1 :(得分:0)

嗯......在我们知道语言之前,我经历过这样做的麻烦,所以我不妨发布它,但它是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/