は、他の誰かがよりよい解決策を見つけることによって助けない限り、私がやるものだ:
# to get __hash__ and __eq__ return id(self)
class Reference:
def __init__(self, item):
self.item = item
class RemovalAPI:
def add_removal_info(self, item, removal_info):
try:
references = item.__reference
except AttributeError:
references = item.__reference = {}
references[Reference(self)] = removal_info
def get_removal_info(self, item):
try:
references = item.__reference
self_reference = Reference(self)
return references[self_reference]
class Container(list, RemovalAPI):
def __iter__(self):
for i in range(len(self)):
item = self[i]
self.add_removal_info(item, i)
yield item
def remove(self, item):
removal_info = self.get_removal_info(item)
del self[removal_info]
def insert(self, item):
self.add_removal_info(item, len(self))
self.append(item)
# do whatever post-processing I need
# ...
場合実装をlist
から他のデータ構造に変更することを決定した場合、パブリックインターフェイスは変更されないままです。
class Container(orderedset, RemovalAPI):
# inheriting __iter__, remove from parent
def insert(self, item):
self.add(item)
# do whatever post-processing I need
# ...
または
class Container(linkedlist, RemovalAPI):
def __iter__(self):
it = super().__iter__()
last_item = None
for item in it:
self.add_removal_info(item, last_item)
yield item
def remove(self, item):
removal_info = self.get_removal_info(item)
if removal_info is None:
self.remove_first()
else:
self.remove_after(removal_info)
def insert(self, item):
self.add_removal_info(item, None)
self.add_to_front(item)
# do whatever post-processing I need
# ...
出典
2012-04-30 23:28:34
max
あなたの質問は何ですか?これは学問的な運動ですか?そうでない場合は、なぜ自分のリストやコンテナを実装していますか? –
このコンテナはどのような目的を果たしますか? Pythonの組込みコレクション型では簡単にはできないことはどうしますか? –
@Steven Rumbalskiパフォーマンスをテストしているため、実装を変更する必要があります。コンテナはis要素の特定の順序を維持します。 – max