2015-05-15 20 views
1

guava中有一个RangeMap实现,它可用于将范围映射到对象。是否有一个库在python中实现RangeDict?

python中是否有类似的库?我还没有找到一个搜索结果。

为了使问题更清楚,RangeDict我的意思是收集支持用法,如:

rd = RangeDict() 
rd[[1,2]] = 'A' 
rd[[11,22]] = 'B' 
print rd[1] # A 
print rd[12] # B 
print 23 in rd # False 
print 18 in rd # True 

EIDT:

因为似乎没有这样的模块,我写了一个here,您可以安装它由pip install rangedict并使用它是这样的:

>>> from rangedict import RangeDict 
>>> rd = RangeDict() 
>>> rd[(1, 2)] = 1 
>>> rd[(3, 3)] = 3 
>>> rd[(5, 7)] = 5 
>>> print rd[6] 
5 
>>> 3 in rd 
True 
>>> del rd[(3, 3)] 
>>> 3 in rd 
False 
+0

你为什么编辑你的问题,但没有解决它的根本问题,这是覆盖在第4项这里http://stackoverflow.com/help /切合主题的?你的问题很好,除了一件事情:它不属于这里,因为规则说它没有。如果您摆脱了对库的请求,则可以避免关闭您的问题,而是探索实现代码。 – GreenAsJade

+1

@GreenAsJade好的,我会关闭它。 – WKPlus

回答

3

我迅速提出满足你的四个主张的这个。但是你需要使用元组作为键(不可变),而不是列表(可变)。

rd = RangeDict() 
rd[(1,2)] = 'A' 
rd[(11,22)] = 'B' 
+0

你为什么不把自己的元组转换成元组?为什么双重下划线为__keytransform__? – deets

+0

python映射/字典需要可交换对象的键,我不会将它隐藏起来,如果他想要的话,我可以隐藏它。我重命名了keytransform方法。 –

+0

谢谢你的回答。但恕我直言,这是最简单的实现,其中大多数操作将具有O(n)复杂性。 – WKPlus

0

方便快捷:

class RangeDict(): 
    def __init__(self): 
     self._dict = {} 

    def __getitem__(self, key): 
     for k, v in self._dict.items(): 
      if k[0] <= key < k[1]: 
       return v 
     raise KeyError("Key not found!") 

    def __setitem__(self, key, value): 
     if len(key) == 2: 
      if key[0] < key[1]: 
       self._dict.__setitem__((key[0], key[1]), value) 

    def __contains__(self, key): 
     try: 
      return bool(self.__getitem__(key)) 
     except KeyError: 
      return False 

rd = RangeDict() 
rd[[1, 2]] = 'A' 
rd[[11, 22]] = 'B' 
print(rd[1]) # A 
print(rd[18]) # B 
print(23 in rd) # False 
print(18 in rd) # True 
相关问题