2015-11-15 144 views
2

這是一本python書的測試項目。我試圖迭代一個列表,並檢查每個項目是否是字典中的一個鍵。如果是,再加入1到字典中的值,如果不添加鍵,然後將該值設置爲1,這是我到目前爲止的代碼:Python遍歷列表和詞典

inv_original = {'gold coin' : 42, 'rope' : 1} 
dragonloot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 

def addtoinventory(dict_a, addeditems): 
    for i in addeditems: 
     if dict_a.has_key(i): 
      dict_a[str(i)] = dict_a.get(i, 0) + 1 
     else: 
      dict_a[str(i)] = 1 
     return dict_a 

    inv = addtoinventory(inv_original, dragonloot) 

    print inv 

它似乎工作,但只在第一項列表中,它不會遍歷其餘部分。任何人都可以幫忙嗎?

+3

你回來得太早。專業提示:[不要使用'has_key'](https://docs.python.org/2/library/stdtypes.html#dict.has_key),只需使用'if if in dict_a:'。 –

回答

2

完成第一次迭代後,函數返回。

def addtoinventory(dict_a, addeditems): 
    for i in addeditems: 
     if dict_a.has_key(i): 
      dict_a[str(i)] = dict_a.get(i, 0) + 1 
     else: 
      dict_a[str(i)] = 1 
     return dict_a  # <----- issue here 
# ... 

應該由4位撤消縮進行來解決該問題移動循環體外面的return聲明。你還應該考慮:

  • 使用try/except塊,而不是if/else
  • 去除str(i)通話;您的列表元素已經字符串,所以它是沒有必要試圖對他們的字符串轉換,
  • 改進的可變名稱(如inventory而不是dict_a,並items代替addeditems,這很可能是多餘的--IF它在列表中,這顯然增加了:)

更新的代碼如下:

#!/usr/bin/python 

inv_original = {'gold coin' : 42, 'rope' : 1} 
dragonloot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 

def addtoinventory(inventory, items): 
    for i in items: 
     try: 
      inventory[i] += 1 
     except KeyError: 
      inventory[i] = 1 

    return inventory 

# 
print addtoinventory(inv_original, dragonloot) 
# ... 

現在的代碼的輸出是:{'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1},顯示出gold coin鍵增加了如您所料,已添加和其他鍵/ VAL對。