2015-09-19 13 views
-1

所以我不得不編寫一個程序,根據它們的高度將植物的SAMPLE ID NO's排序成一個列表(按照高度的升序),我做了一個代碼,它只適用於小值。當我把大的數值,它表明:KeyError:2當使用較大的值

Traceback (most recent call last): 
    File "C:/Python34/plant_hieght_id.py", line 15, in <module> 
    del d[int(w[0])] 
KeyError: 2 

我的代碼,可以發現:http://pastebin.com/embed_js.php?i=TXQ94tUy

+3

你應該在這裏添加代碼,而不是鏈接它。 –

+1

這是個錯誤的假設,我們會通過閱讀代碼來理解您想要做什麼...... – alfasin

+0

您正在循環中執行以下操作:'d [id] = ht' - 您有多少個不同的值認爲在執行退出循環時會有'd'嗎? – alfasin

回答

0

I had to write a program to sort the SAMPLE ID NO's of plants according to their heights into a list (ascending order of heights)

所以,如果d包含ID,以高度的映射,並要獲得ID序列按升序高度的順序進行排序,你想做的事:

e = sorted(d, key=lambda k: d[k], reverse=True) 
  • 伊特拉翻遍字典迭代密鑰,因此​​與sorted(d.keys())相同。

  • 通過指定key=lambda k: d[k]您可以自定義比較的執行方式。這裏比較是在值d[k]而不是密鑰上完成的

  • 使用reverse=True排序按降序排列。 (在你的問題的文字,你說升序排列,但您提供的代碼沒有做到這一點。如果它真的上升,你只想刪除reverse=True參數)


與你原來的代碼的問題是即:

w=list(d.fromkeys(str(q))) 

fromkeys方法接受一個可迭代,並創建與設置爲可迭代值的新詞典。

在這種情況下,q是一個數字,假設它是123str(q)是字符串"123"。 所以d.fromkeys(str(q))是字典{'1': None, '2': None, '3': None }

您將集合w添加到密鑰列表中。所以w['1', '2', '3']

最後d[int(w[0])]試圖刪除密鑰1但是代碼不能保證這個密鑰存在!

當您在前一個循環中輸入值時,可能沒有插入任何1鍵!

從代碼我猜想,你想獲得最大值並將其刪除。

如果你想刪除你應該做的最大元素:

key, val = max(d.items(), key=lambda x_y: x_y[1]) 
del d[key] 

這裏max發現(key, value)對具有最大值的字典裏,然後將其刪除。

+0

謝謝。我明白我犯的錯誤。 :) – PrinceofThorns