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

在python中如何通过属性访问特定的类实例?,python,Python,假设我有一个具有两个属性的类框,self.contents和self.number。我在一个名为box的列表中有box的实例。是否可以通过属性访问/修改特定实例,而不是通过框进行迭代?例如,如果我想要一个box.number=40的框(并且列表未排序),那么修改其内容的最佳方法是什么。如果您需要更频繁地修改,并且您有唯一的编号,则创建一个字典: numberedBox = dict((b.number, b) for b in Boxes) 然后,您可以使用以下号码直接访问您的邮箱: numb

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

如果您需要更频繁地修改,并且您有唯一的
编号,则创建一个字典:

numberedBox = dict((b.number, b) for b in Boxes)
然后,您可以使用以下号码直接访问您的邮箱:

numberedBox[40]
但是如果你想更改他们的号码,你也必须修改
numberedBox
字典


否则是的,您必须迭代列表。

如果您需要更频繁地执行此操作,并且您有唯一的
编号,请创建字典:

numberedBox = dict((b.number, b) for b in Boxes)
然后,您可以使用以下号码直接访问您的邮箱:

numberedBox[40]
但是如果你想更改他们的号码,你也必须修改
numberedBox
字典


否则是的,您必须迭代列表。

最简单的方法是使用列表理解:

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

不过要注意。这实际上会迭代整个
列表。由于
列表
没有排序,没有比迭代它(从而进行线性搜索)更快的方法,除非您想将所有数据复制到其他数据结构中(例如
dict
设置
或对
列表
排序)。

最简单的方法是使用列表理解:

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

不过要注意。这实际上会迭代整个
列表。由于
列表
没有排序,没有比迭代它(从而进行线性搜索)更快的方法,除非您想将所有数据复制到其他数据结构中(例如
dict
设置
或对
列表
排序)。

使用内置过滤器:

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

使用内置过滤器:

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

虽然不如使用字典灵活,但您可以使用简单的查找表将方框编号映射到
方框中的特定方框。例如,如果您知道箱子编号的范围可以是
0…MAX\u box\u NUMBER
,那么下面的步骤将非常快。只需对
列表进行一次完整扫描即可设置表格

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)

如果框编号在其他任意范围内,则在将其用作索引之前,必须对其应用一些较小的算术运算。如果范围非常大,但人口稀少,字典将是节省内存的方法,但需要更多的计算——这是通常的折衷办法。

虽然没有使用字典灵活,但您可能可以通过使用简单的查找表将框号映射到
框中的特定框。例如,如果您知道箱子编号的范围可以是
0…MAX\u box\u NUMBER
,那么下面的步骤将非常快。只需对
列表进行一次完整扫描即可设置表格

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)

如果框编号在其他任意范围内,则在将其用作索引之前,必须对其应用一些较小的算术运算。如果范围很大,但人口稀少,那么字典将是节省内存的方法,但需要更多的计算——这是通常的折衷办法。

感谢字典的想法,我根本没有想到这一点谢谢字典的想法,我根本没有想到这一点