2013-04-14 59 views
3

鑑於這樣的字典和可變的最大鍵:獲取字典,而是低於可變

dic = {0 : 'some', 10 : 'values', 20 : 'whatever'} 
var = 14 

我想從其中關鍵是最大的,但低於或等於字典中獲得的價值變量。我不知道這是否清楚,但在這種情況下,我正在尋找10

我已經想出了這個函數,但我想知道是否有更簡單的方法來做到這一點,因爲我對Python很新。

def get_greatest_key(dic, var): 
    # if the key exists no need to search 
    if var in dic: 
     return dic[var] 
    else: 
     # create a list with all the keys sorted in reverse 
     l = sorted(dic, key=dic.get) 
     i = 0 
     while i < len(l): 
      # parse the list 
      if l[i] <= var: 
       return dic[l[i]] 
      i += 1 
     # by default we return the last element in the dictionary 
     return dic[l[len(l) - 1]] 
+3

如果你需要做很多,一個字典可能是錯誤的數據結構。我會建議一個平衡的BST,除非我不知道現有的Python實現。 – delnan

+0

我建議使用[AVL樹](http://en.m.wikipedia.org/wiki/AVL_tree)代替。也就是說,或按鍵排序字典,並使用二進制搜索。 – Zyerah

回答

8

如果要小於或等於var最大鍵,則可以通過一個發電機表達到max功能:

>>> dic = {0 : 'some', 10 : 'values', 20 : 'whatever'} 
>>> var = 14 
>>> max(k for k in dic if k <= var) 
10 

與相應的值

>>> dic[max(k for k in dic if k <= var)] 
'values' 

如果您認爲合適的參數爲max爲空,您可以決定如何處理ValueError

+0

這就是我對python的喜愛,你可以在一行中做出令人敬畏的事情。可悲的是我不知道它足夠發現它們。非常感謝!我會盡快接受答案。 – romainberger