有没有一种方法可以通过python中的参数在列表中搜索对象?

时间:2020-08-18 10:39:42

标签: python list object

我的程序中有一个函数可以更新存储在列表中的对象,而另一个函数可以找到对象在该列表中的位置。所有对象都有一个“ id”参数,我想知道是否有一种方法可以仅通过使用“ id”参数来搜索该列表中的对象

这是find_position()函数:

def find_position(self, object):
        for i in range(len(self._objectsList)):
            if self._objectsList[i] == object:
                return i
        return -1

2 个答案:

答案 0 :(得分:0)

假设您可以通过object.id访问id属性:

def find_position_by_id(self, id):
        for el in self._objectsList:
            if el.id == id:
                return self._objectsList.index(el)
        return -1

您还可以考虑在主对象内使用字典,以便存储其他对象。字典的键可以是其他对象的ID。

答案 1 :(得分:0)

在第一个对象的索引中,.id等于某个值之后,您似乎想在函数中捕获它:

def find_position_by_id(objects, identifier):
    return next((i for i, obj in enumerate(objects) if obj.id == identifier), -1)

分几步说明:

  • enumerate(objects)返回一个可迭代对象,该变量生成objects的索引和值的元组,即(0, objects[0])(1, objects[1])等。
  • i for i, obj in enumerate(objects)是一次生成这些索引和值一个并将其分配给iobj的生成器,它仅生成i的值。
  • i for i, obj in enumerate(objects) if obj.id == identifier是同一生成器,但是它仅生成与对象i配对的obj的值,对象.id等于identifier < / li>
  • 将其包装在next(<iterable>, -1)中,您只能从该生成器中获取第一个值,如果生成器中没有值,则只能获取-1

因此,next((i for i, obj in enumerate(objects) if obj.id == identifier), -1)可以满足您的需求,您可以将其包装在函数或示例代码中的方法中。

将一些示例数据放在一起:

from dataclasses import dataclass


@dataclass
class Obj:
    id: int
    value: str


objects = [Obj(10, 'Alice'), Obj(20, 'Bob'), Obj(30, 'Charlie')]


def find_position_by_id(xs, identifier):
    return next((i for i, x in enumerate(xs) if x.id == identifier), -1)


print(find_position_by_id(objects, 20))

结果:

1