我想做一种字典类,用于稀疏数据。我们的想法是,如果该键不在字典中找到一个较低的值最接近的键(我的字典的键始终为正整数,最低的存在始终为零)字典中的递归查找
这里是我的原型
class specialdict(dict):
def __getitem__(self, beg):
try:
return self[beg - 1]
except:
return dict.__getitem__(self, beg)
a = specialdict([(10, True)])
print a[137]
print a[500]
而这个工作,但只到338
我猜它与递归的事,但我虽然蟒蛇递归数较高。我也需要查找速度非常快...
我是否会犯错,有没有更好的方法来做到这一点?
感谢
编辑:
一个例子:
如果我只具有键 “0”, “10” 和 “15”,并搜索键 “13”,余希望的GetItem功能给我相应的GetItem (10)
如果我想重点“100”应该得到的GetItem价值的价值(15))。
EDIT 2
没有特别的原因,我需要它是一本字典,或的GetItem功能是递归的。但我有这种感觉,这将是最快的方式。
编辑3
我试图提出@gilland所有3个解决方案@托马斯 - 洛采:
import bisect
class SparseData(object):
def __init__(self, pairs=()):
if pairs:
indexes, values = zip(*pairs)
self.indexes = list(indexes)
self.values = list(values)
else:
self.indexes = []
self.values = []
def __setitem__(self, index, value):
i = bisect.bisect(self.indexes, index)
self.indexes.insert(i, index)
self.values.insert(i, value)
def __getitem__(self, index):
i = bisect.bisect(self.indexes, index)
if not i:
raise IndexError(i)
return self.values[i-1]
class specialdict_rec(dict):
def __getitem__(self, beg):
try:
return dict.__getitem__(self, beg)
except KeyError:
return self[beg - 1]
class specialdict_non_rec(dict):
def __getitem__(self, beg):
while beg >= 0:
try:
return dict.__getitem__(self, beg)
except KeyError:
beg -= 1
这里的基准结果:
In [1]: a = [(1, '1'), (7, '7'), (100, '100')]
In [2]: a1 = SparseData(a)
In [3]: a2 = specialdict_rec(a)
In [4]: a3 = specialdict_non_rec(a)
In [5]: %timeit -n10000 a1[200]
10000 loops, best of 3: 1.12 µs per loop
In [6]: %timeit -n10000 a2[200]
10000 loops, best of 3: 96 µs per loop
In [7]: %timeit -n10000 a3[200]
10000 loops, best of 3: 58.6 µs per loop
所以这是真的递归不会改善任何事情,正如@吉尔所说,这是危险的。
但最后我要用的解决方案是来自@ thomas-lotze的解决方案。 非常感谢您的回答!
是否有一个密钥的下限,或者是不知道的? – gil
因此,您正在Python中寻找像Java的['TreeMap'](http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html)之类的东西,特别是它的[[' lowerEntry'](http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html#lowerEntry%28K%29)方法? –
@fransua,你能否定义“最接近上游”?你到底想做什么?你能提供一些输入和期望的输出数据吗? – MaxU