2010-10-08 102 views
0

假設我有一個具有兩個屬性的類Box,self.contents和self.number。我在名爲Boxes的列表中有框的實例。無論如何,通過它的屬性來訪問/修改一個特定的實例,而不是遍歷Boxes?例如,如果我想要一個box.number = 40的盒子(並且該列表未被排序),那麼修改其內容的最佳方式是什麼?如何通過Python中的屬性訪問特定的類實例?

回答

2

如果您需要做的更頻繁,你有獨特的number S,然後創建一個字典:

numberedBox = dict((b.number, b) for b in Boxes) 

然後你可以用數字直接訪問您的箱子:

numberedBox[40] 

但如果你要改變他們的號碼,你將不得不修改numberedBox詞典...

否則是的,你必須遍歷列表。

+0

感謝您的字典的想法,我根本沒有想到 – jlv 2010-10-08 19:03:47

1

的最直接方式是使用列表理解:

answer=[box for box in boxes if box.number==40] 

即使被警告。這實際上遍歷整個list。由於list未被排序,因此除非要將所有數據複製到其他數據結構(例如dictsetlist),否則沒有比遍歷它更快的方法(並因此執行線性搜索)。

0

使用過濾器內置:

wanted_boxes = filter(lambda box: box.number == 40, boxes) 
0

雖然不夠靈活使用字典,你也許可以通過在boxes使用簡單的查找表的映射盒數到特定的盒子來獲得。例如,如果您知道箱號可能範圍爲0...MAX_BOX_NUMBER,那麼以下情況會非常快。它只需要對Boxes列表進行一次全面掃描即可設置表格。

MAX_BOX_NUMBER = ... 

# setup lookup table 
box_number = [None for i in xrange(MAX_BOX_NUMBER+1)] 
for i in xrange(len(Boxes)): 
    box_number[Boxes[i].number] = Boxes[i] 

box_number[42] # box in Boxes with given number (or None) 

如果選中號碼是在其他一些任意的範圍,一些小的算術會對他們的指數使用前必須適用於他們。如果範圍非常大,但人口稀少,字典將成爲節省內存的途徑,但需要更多的計算 - 通常的折衷。

相關問題