我创建了一个只有位置和状态数据的类(项)(数字表示项的唯一枚举,状态可以是0,1)。
class item:
def __init__(self, number, state):
self.number = number
self.state = state
def __repr__(self):
return('item(%s,%s)'%(self.position,self.state))
我正在尝试为这些项创建一个容器/集合,其中一个随机子集的状态设置为1,目前我正在使用它:
from random import randint
N = 1024
num_defectives = 10
list_of_items = [item(i,0) for i in range(0,N)]
for i in range(0, num_defectives):
r = randint(0,N)
list_of_items[r].state = 1
但是我想把它包装成一个不是原始列表的东西(因为我不认为;特别好的悬挂我的代码),但它跟踪项目状态的总和。
理想情况下,它还将具有状态为1的项目位置的不可访问列表(我只允许查询状态的总和,或者我的子集是否包含状态为1的这些项目的成员)。
目前我正在选择此列表中的随机成员,并测试状态总和,如下所示:
items_to_test = [randint(0,n) for i in range(0,groupSize)]
group = []
for item in items_to_test:
group.append(inList[item])
states = sum([x.state for x in group])
if states:
#do some stuff to find an item with state 1, remove it from list_of_items
else:
#remove all the items in group from list_of_items
基本上,我正在寻找一种更清晰的方式来通过集合来完成所有这些行为。
我看过这个问题的答案:
How to subclass Python list without type problems?
和这个问题:
What to consider before subclassing list?
并阅读:
http://docs.python.org/2/reference/datamodel.html#emulating-container-types
但是我仍然不确定从哪里开始(除了子类化对象),因为我对python提供的所有'魔术'函数都很不熟悉。
答案 0 :(得分:1)
首先在列表周围创建一个简单的包装器。机会是,你不需要任何更复杂的东西。我认为您的用例过于专门用于子类化list
。
from random import randint
# user-defined class names are conventionally capitalized.
class Item:
...
class ItemCollection:
def __init__(self, N=1024, num_defectives=10):
self.list_of_items = [Item(i,0) for i in range(0,N)]]
for i in range(0, self.num_defectives):
r = randint(0,N)
self.list_of_items[r].state = 1
self.state_sum = sum(x.state for x in self.list_of_items)
def states_of_one(self):
return [ x from self.list_of_items if x.state == 1 ]
def has_state_of_one(self, i):
return self.list_of_items[i].state == 1