0

私はキーのリストを持っています:特定のキーに添付された整数値を持つ値...

これらの整数値は、特定の手の文字数を表します...

たとえば、これは手です -

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 という単語の文字がすべて 1 つ減っていることに気付きましたか?

では、キーの値が 0 より大きい場合、キーの値を 1 減らして変更するにはどうすればよいでしょうか?

ここに私がこれまでに持っているコードがあります -

for c in word:

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

return hand
4

2 に答える 2

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、の値がの2場合c、を設定することを意味しますx = 2。ただし、変更するとinの値が変更されるという意味ではありません。代わりに、少し違うことをする必要があります。xchand

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')

これら2つのうち最初の1つを実行する必要があります。これを実現する1つの方法は、 ;hand = hand.copy()の最初の行として追加することです。updateHandその後、古いものをそのままにします。


さて、もう1つは、コードが0値を出力に入れているのは、値が1であった場合ですが、割り当てには値がまったく含まれていないということです。このケースを正確に処理する方法を理解するためにあなたに任せますが、それを行う1つの方法のヒントとして、ステートメントを介して辞書からアイテムを削除できますdel hand[c]


これを行うことはお勧めしませんが、@JaredがPythonを少し披露するための脇として::)

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

(呼び出しで戻り値をラップしdictて、正確に目的のインターフェイスにします)

于 2013-03-09T01:08:50.203 に答える
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/

于 2013-03-09T01:09:17.377 に答える