创建自定义集合

时间:2013-12-09 14:25:34

标签: python data-structures

我创建了一个只有位置和状态数据的类(项)(数字表示项的唯一枚举,状态可以是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提供的所有'魔术'函数都很不熟悉。

1 个答案:

答案 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