如何在python中按属性访问特定的类实例?

时间:2010-10-08 18:56:41

标签: python

假设我有一个包含两个属性的类Box,self.contents和self.number。我在名为Boxes的列表中有框的实例。无论如何通过其属性访问/修改特定实例而不是迭代Box?例如,如果我想要一个box.number = 40的框(并且列表没有排序),那么修改其内容的最佳方法是什么。

4 个答案:

答案 0 :(得分:2)

如果您需要更频繁地执行此操作并且您拥有唯一的number,那么请创建一个词典:

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

然后,您可以直接使用数字访问您的框:

numberedBox[40]

但是如果你想改变他们的号码,你也必须修改numberedBox字典......

否则是的,你必须遍历列表。

答案 1 :(得分:1)

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

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

但请注意。这实际上会迭代整个list。由于list没有排序,因此没有比迭代它更快的方法(因此进行线性搜索),除非你想将所有数据复制到其他数据结构中(例如dictset或对list进行排序。

答案 2 :(得分:0)

使用内置过滤器:

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

答案 3 :(得分: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)

如果框号在某个其他任意范围内,则在将它们用作索引之前必须对它们应用一些小算术。如果范围非常大,但人口稀少,那么词典将是节省内存的方法,但需要更多的计算 - 通常的权衡。