2013-12-09 156 views
0

我創建了一個只包含位置和狀態數據的類(項目)(數字表示項目的唯一枚舉,狀態可以是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

首先在列表的周圍做一個簡單的包裝。有機會,你不需要任何更復雜的東西。我認爲你的用例過於專業化,不適用於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