2011-11-03 16 views
3

有誰知道一個快速OrderedSet實施蟒蛇說:的Python OrderedSet用的.index()方法

  • 記得插入順序
  • 都有一個索引()方法(如一個列表提供)

所有的實現,我發現缺少的.index()方法。

+0

你嘗試什麼實現? –

+0

例如http://code.activestate.com/recipes/576694/也blist – Titusz

+0

是那它是什麼?需要一定的時間。我只需要。新增()和的.index() – Titusz

回答

6

你總是可以在子類中添加。這是給你的評論鏈接的OrderedSet的基本實現:

class IndexOrderedSet(OrderedSet): 
    def index(self, elem): 
     if key in self.map: 
      return next(i for i, e in enumerate(self) if e == elem) 
     else: 
      raise KeyError("That element isn't in the set") 

你提到你只需要addindex,並在順序迭代。你可以通過使用OrderedDict作爲存儲來獲得。作爲獎勵,你也可以繼承的collections.Set抽象類,以獲得另一組操作frozenset的支持:

from itertools import count, izip 
from collections import OrderedDict, Set 

class IndexOrderedSet(Set): 
    """An OrderedFrozenSet-like object 
     Allows constant time 'index'ing 
     But doesn't allow you to remove elements""" 
    def __init__(self, iterable =()): 
     self.num = count() 
     self.dict = OrderedDict(izip(iterable, self.num)) 
    def add(self, elem): 
     if elem not in self: 
      self.dict[elem] = next(self.num) 
    def index(self, elem): 
     return self.dict[elem] 
    def __contains__(self, elem): 
     return elem in self.dict 
    def __len__(self): 
     return len(self.dict) 
    def __iter__(self): 
     return iter(self.dict) 
    def __repr__(self): 
     return 'IndexOrderedSet({})'.format(self.dict.keys()) 

不能繼承collections.MutableSet因爲你不能支持從集合中刪除元素,並保持正確的索引。

+0

,看起來不錯的表現......我會嘗試 – Titusz

+0

@agf - 如果你真的打我太吧:) –

+0

@Titusz只需要'add'和'index',那麼也許你可以嘗試像我添加的東西。 – agf

相關問題