假设我有一个包含两个属性的类Box,self.contents和self.number。我在名为Boxes的列表中有框的实例。无论如何通过其属性访问/修改特定实例而不是迭代Box?例如,如果我想要一个box.number = 40的框(并且列表没有排序),那么修改其内容的最佳方法是什么。
答案 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
没有排序,因此没有比迭代它更快的方法(因此进行线性搜索),除非你想将所有数据复制到其他数据结构中(例如dict
,set
或对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)
如果框号在某个其他任意范围内,则在将它们用作索引之前必须对它们应用一些小算术。如果范围非常大,但人口稀少,那么词典将是节省内存的方法,但需要更多的计算 - 通常的权衡。