2015-05-15 19 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 
相關問題