我的程序中有一个函数可以更新存储在列表中的对象,而另一个函数可以找到对象在该列表中的位置。所有对象都有一个“ 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
答案 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)
是一次生成这些索引和值一个并将其分配给i
和obj
的生成器,它仅生成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