2012-10-24 302 views
2

假設我有某種類似這樣的字典結構(或代表同樣的事情的另一個數據結構的Python字典浮動搜索

d = { 
    42.123231:'X', 
    42.1432423:'Y', 
    45.3213213:'Z', 
    ..etc 
} 

我想創建這樣一個功能:

f(n,d,e): 
    '''Return a list with the values in dictionary d corresponding to the float n 
    within (+/-) the float error term e''' 

所以,如果我用上面的字典這樣調用該函數:

f(42,d,2) 

它將換貨政... RN

['X','Y'] 

不過,雖然是簡單的寫一個循環這個功能,我不想做一些事情,通過每一個值在字典中並徹底檢查它去,但我想它利用的索引結構(或者甚至可以使用排序列表)來使得搜索速度更快。

+0

考慮使用'list'和[bisect](http://docs.python.org/library/bisect#searching-sorted-lists)模塊。 – eryksun

回答

3

字典是這個錯誤的數據結構。編寫一個搜索樹。

0

Python字典是一個hashmap實現。它的鍵不能像搜索樹中那樣進行比較和遍歷。所以你根本無法使用python字典來做到這一點,而無需實際檢查所有密鑰。

0

帶數字鍵的字典通常按鍵值排序。不過,你可能 - 是在安全方面 - 重新安排它作爲OrderedDictionary - 你做一次

from collections import OrderedDict 
d_ordered = OrderedDict(sorted(d.items(), key =lambda i:i[0])) 

然後篩選值是相當簡單 - 它會在上邊框

import itertools  
values = [val for k, val in 
      itertools.takewhile(lambda (k,v): k<upper, d_ordered.iteritems()) 
      if k > lower] 

由於停止我已經說過,訂購字典並不是真的必要 - 但有些人會說這個假設是基於當前的實現,並可能在未來發生變化。