python集合支持索引吗_Python中的可索引弱有序集合

我想知道是否有一种简单的方法在Python中构建可索引弱有序集。我试图自己创建一个。以下是我想到的:

"""

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])有没有更简单的方法来做到这一点?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值