2017-02-10 20 views
0

私は現在、ここにある2番目の練習をしています。 https://automatetheboringstuff.com/chapter5(「ファンタジーゲームインベントリのための辞書機能へのリスト」)Pythonでリストから辞書に項目を追加する

タスクは、リストの項目を辞書に追加することです。

私のforループはリスト全体をループしていません。理由を理解するのを助けてくれますか? したがって金貨キーの値が(ない3れる1だけ増加させ、私はこのコードを実行すると、結果は、「{:1、 『金貨』 43 『ロープ』}」である

def addToInventory(inventory, addedItems): 
    for i in addedItems: 
     if i in inventory: 
      inventory[i] = inventory[i] + 1 
     else: 
      inventory[i] = 1 
     return inventory 

inv = {'gold coin': 42, 'rope': 1} 
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 
inv = addToInventory(inv, dragonLoot) 
print(inv) 

これが想定されている)、「dagger」と「ruby」は無視されます。

私は他の場所で実際に解決策を見つけましたが、なぜこのコードが機能しないのか理解したいと思っています。

ありがとうございます。

+1

'リターンinventory'があなたの' for'ループ内です!それはすぐに返る –

答えて

2
def addToInventory(inventory, addedItems): 
    for i in addedItems: 
     if i in inventory: 
      inventory[i] = inventory[i] + 1 
     else: 
      inventory[i] = 1 
    return inventory 

for後、ないifreturn。)

+1

なぜこれがダウン投票を得たのだろうか。それは正解です! –

+2

あなたはコードを提供し、あなたが変更した内容を示しましたが、理由を説明していません。 (注:私はdownvoterではない) – byxor

+1

さらにこれはちょうどタイプミスです。 OPはコードを正しくインデントすることを知っている必要があります。 –

0

問題は、単純なインデントのタイプミスでした。さて、より効率的な/ pythonのコードを書くつもりだったら、項目を数える特殊な辞書タイプのcollections.Counterを使うことができます。あなたのコードは短くし、最適化することができます。

from collections import Counter 

inv = Counter({'gold coin': 42, 'rope': 1}) 

inv.update(['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']) 

print(inv) 

結果:

Counter({'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1}) 
+0

pythonコーディングを改善しようとする回答をdownvotingしてくれてありがとう。 –

+0

と修正upvoteのためにありがとう:) –

+0

ありがとう、それをありがとう。 –

関連する問題