通过参数访问类对象?

时间:2018-01-30 20:52:00

标签: python list class search

有没有办法找到保存在列表中的对象,只知道它的参数而没有遍历所述列表?

例如,有一个类,其对象具有(x; y)坐标,并且没有任何对象共享相同的坐标(所有x / y对都是不同的,不是重复)。这些对象都保存在列表中:

class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

points = [Point(...), Point(...), Point(...), Point(...), ...]

每当我需要特定的实例时,有没有办法找到它(这里:它在列表中的索引)只使用它的坐标而不遍历整个列表,如下所示:

def find_objects_index(x, y):
    for i in range(len(points)):
        if points[i].x == x and points[i].y == y:
            return i

编辑:访问这些Point()是为了写作,而不是阅读,因此object.xobject.y 会改变,你可以&#39 ;只需创建一个以(object.x, object.y)为键的字典 - 您需要添加新条目并每次删除旧条目。

3 个答案:

答案 0 :(得分:2)

您可以使用带条件的列表聚合来获取您要查找的项目:

matching = [p for p in points if p.x = VALX and p.y == VALX]

但是,在这种情况下,以(x,y)为键的字典很可能是正确的(并且表现良好)。

答案 1 :(得分:1)

只需将Points放入dict()

即可
class Point():
    def __init__(self, x, y):
        self.x = x
        self.y = y

points_list = [Point(...), Point(...), Point(...), Point(...), ...]
points_dict = {(p.x,p.y):p for p in points_list}


def find_object(x, y):
    if (x,y) in points_dict:
        return points_dict[(x,y)]

def replace_object(x, y, new_point):
    points_dict.pop((x, y), None)
    points_dict[(new_point.x, new_point.y)] = new_point

答案 2 :(得分:1)

  

有没有办法找到保存在列表中的对象,只知道它   参数并没有遍历上述列表?

简短回答:不。

如果您想要或需要快速遍历这样的数据点集合,也许您应该考虑使用除列表之外的类型 - 例如基于x或y数据的二叉树(或者如果您需要跟踪它们分开,也许每棵树一个?)