假設我有一個具有兩個屬性的類Box,self.contents和self.number。我在名爲Boxes的列表中有框的實例。無論如何,通過它的屬性來訪問/修改一個特定的實例,而不是遍歷Boxes?例如,如果我想要一個box.number = 40的盒子(並且該列表未被排序),那麼修改其內容的最佳方式是什麼?如何通過Python中的屬性訪問特定的類實例?
0
A
回答
2
如果您需要做的更頻繁,你有獨特的number
S,然後創建一個字典:
numberedBox = dict((b.number, b) for b in Boxes)
然後你可以用數字直接訪問您的箱子:
numberedBox[40]
但如果你要改變他們的號碼,你將不得不修改numberedBox
詞典...
否則是的,你必須遍歷列表。
1
的最直接方式是使用列表理解:
answer=[box for box in boxes if box.number==40]
即使被警告。這實際上遍歷整個list
。由於list
未被排序,因此除非要將所有數據複製到其他數據結構(例如dict
,set
或list
),否則沒有比遍歷它更快的方法(並因此執行線性搜索)。
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)
如果選中號碼是在其他一些任意的範圍,一些小的算術會對他們的指數使用前必須適用於他們。如果範圍非常大,但人口稀少,字典將成爲節省內存的途徑,但需要更多的計算 - 通常的折衷。
相關問題
- 1. 如何訪問類實例的屬性
- 2. 可以通過實例和類訪問的可覆蓋屬性
- 3. Python:如何通過派生類實例訪問父類對象?
- 4. 如何訪問Python超類的屬性通過__class __.__ dict__?
- 5. 如何通過Python中的子類的實例訪問基類變量?
- 6. 在JavaScript中,如何訪問超類實例的屬性?
- 7. 通過屬性查找數組中的特定實例
- 8. 訪問某個類的特定實例
- 9. 如何通過Python中的類字典直接訪問類實例
- 10. 通過屬性的特定屬性和調用方法來過濾類實例的屬性
- 11. 如何在較少的mixin中訪問特定的類屬性?
- 12. 訪問通用實例屬性
- 13. 訪問以特定字符串開頭的實例屬性
- 14. 如何通過python中的__dict__指定新的類屬性?
- 15. Python - 通過模塊屬性(通過字符串名稱)獲得對類實例的訪問
- 16. 的Python:通過實例訪問類變量
- 17. 如何使用Knockout訪問綁定對象實例的屬性
- 18. 訪問該類中的Python實例var
- 19. C#類:通過實例訪問方法
- 20. C#如何通過類屬性創建類實例
- 21. 通過在Python中使用變量來訪問類屬性?
- 22. 通過C#中的子類創建特定的類實例
- 23. CssStyleCollection類:通過反射訪問屬性
- 24. 如何通過反射訪問屬性?
- 25. 如何通過ApplicationContext訪問屬性
- 26. 如何通過jquery訪問javascript屬性?
- 27. 通過實例變量控制類的特定實例
- 28. 如何通過引用的字段/屬性訪問屬性
- 29. 如何通過名稱訪問某個類的屬性?
- 30. 通過JavaScript中的keyPath訪問屬性?
感謝您的字典的想法,我根本沒有想到 – jlv 2010-10-08 19:03:47