में सूचकांक कमजोर आदेशित सेट सेट मैं सोच रहा था कि पाइथन में एक सूचकांक कमजोर आदेशित सेट बनाने का कोई आसान तरीका है या नहीं। मैंने खुद को बनाने की कोशिश की। यहां मैं ये आया हूं:पायथन
"""
An indexable, ordered set of objects, which are held by weak reference.
"""
from nose.tools import *
import blist
import weakref
class WeakOrderedSet(blist.weaksortedset):
"""
A blist.weaksortedset whose key is the insertion order.
"""
def __init__(self, iterable=()):
self.insertion_order = weakref.WeakKeyDictionary() # value_type to int
self.last_key = 0
super().__init__(key=self.insertion_order.__getitem__)
for item in iterable:
self.add(item)
def __delitem__(self, index):
values = super().__getitem__(index)
super().__delitem__(index)
if not isinstance(index, slice):
# values is just one element
values = [values]
for value in values:
if value not in self:
del self.insertion_order[value]
def add(self, value):
# Choose a key so that value is on the end.
if value not in self.insertion_order:
key = self.last_key
self.last_key += 1
self.insertion_order[value] = key
super().add(value)
def discard(self, value):
super().discard(value)
if value not in self:
del self.insertion_order[value]
def remove(self, value):
super().remove(value)
if value not in self:
del self.insertion_order[value]
def pop(self, *args, **kwargs):
value = super().pop(*args, **kwargs)
if value not in self:
del self.insertion_order[value]
def clear(self):
super().clear()
self.insertion_order.clear()
def update(self, *args):
for arg in args:
for item in arg:
self.add(item)
if __name__ == '__main__':
class Dummy:
def __init__(self, value):
self.value = value
x = [Dummy(i) for i in range(10)]
w = WeakOrderedSet(reversed(x))
del w[2:8]
assert_equals([9,8,1,0], [i.value for i in w])
del w[0]
assert_equals([8,1,0], [i.value for i in w])
del x
assert_equals([], [i.value for i in w])
क्या ऐसा करने का कोई आसान तरीका है?
बहुत अच्छा! 'Weakref.WeakSet' के 'डेटा' सदस्य कहां से दस्तावेज है? –
वीकसेट के लिए दस्तावेज़ अपूर्ण हैं (लगभग मौजूद नहीं हैं)। –
पायपी वही (या बहुत समान) 'वीकसेट' कार्यान्वयन का उपयोग करता है, इसलिए यह वहां भी काम करता है ('gc.collect()' को कमजोरियों को हटाने के लिए आवश्यक है)। – simonzack