2010-08-25 38 views
1

我的任務是創建一個硬件籠的模型。每個插槽包含N插槽,每個插槽可能包含或不包含卡。重載列表理解行爲?

我想使用列表對籠子建模。每個列表索引將對應於插槽編號。 cards[0].name="Card 0"

這將允許我的用戶通過簡單的列表解析來查詢模型。例如:

for card in cards: 
    print card.name 

我的用戶,這是不復雜的Python用戶,將與實時模型進行交互,所以它是不實際的列表索引不對應於一個人口卡。換句話說,如果用戶取出一張卡片,我需要做一些事情,表明該卡片沒有填充—我的第一個衝動是將列表項目設置爲None

Bossman喜歡這個方案,但是他對上面列表的理解並不是瘋狂的,因爲如果缺少一張牌,上面的失敗就會失敗。 (目前的做法。)他甚至不支持要求用戶學習足夠的Python來創建列表理解表達式,該表達式將忽略None

我的想法是將list分類,創建一個newclass。它會像列表一樣工作,除了for card in cards只會返回未設置爲None的成員。

有人請示範如何重載列表類,以便在子類上調用的列表解析將忽略None? (當我嘗試這樣做時,我的Python技能已經開始崩潰了。)

任何人都可以提出更好的方法嗎?

+0

你能描述一下你的'卡'嗎?他們是字典嗎?類實例? – 2010-08-25 20:29:51

回答

8
>>> class MyList(list): 
...  def __iter__(self): 
...   return (x for x in list.__iter__(self) if x is not None) 
... 
>>> 
>>> ml = MyList(["cat", "dog", None, "fox"]) 
>>> for item in ml: 
...  print item 
... 
cat 
dog 
fox 

>>> [x for x in ml] 
['cat', 'dog', 'fox'] 
>>> list(ml) 
['cat', 'dog', 'fox'] 
+0

D'oh!我很接近......我和你的唯一區別就是你的工作。 ;-)它運作良好!做得好!謝謝! – 2010-08-25 20:47:06

+0

@JS,不客氣 – 2010-08-25 20:50:28

+0

你忘了'super()'。 – habnabit 2010-08-25 21:32:57

1

你可以,如果你使用的是2.6或更高版本做這樣的事情來獲得名稱:

names = [x.name for x in cards if x is not None] 

這應該親近你是什麼,我想以後。

0

可能定義一個函數(假定卡是一個全局變量?!?):

def pcards(): 
    for card in cards: 
     if card: 
      print card.name 

使您的用戶可以簡單地輸入pcards()得到的列表。

2

你可以爲此提供一個生成器/迭代器。

def installed(cage): 
    for card in cage: 
     if card: 
      yield card 

cards = ["Adaptec RAID", "Intel RAID", None, "Illudium Q-36 Explosive Space Modulator"] 

# print list of cards 
for card in installed(cards): 
    print card 
+0

+1使用「Illudium Q-36爆炸空間調製器」:-) – 2010-08-25 21:14:52

+0

我認爲你打印編號列表的代碼已損壞。它顯示了插槽2中的Q-36 – 2010-08-25 21:20:19

+0

非常正確,沒有辦法與我提供的那樣做,所以我刪除了它。你需要一個替換枚舉函數。我將作爲練習給讀者。 :-) – kindall 2010-08-25 21:36:24