根据属性值在对象列表中获取对象引用的最佳方法

Ste*_*611 1 python list-comprehension

考虑以下类:

class MyClass():
    def __init__(self,attr):
        self.attr=attr
Run Code Online (Sandbox Code Playgroud)

和 MyClass 对象列表:

myList=[MyClass(1),MyClass(2),MyClass(3)]
Run Code Online (Sandbox Code Playgroud)

属性值是唯一的。要获取具有特定值的对象的引用(例如:2),我使用了

[i for i in myList if i.attr==2][0]
Run Code Online (Sandbox Code Playgroud)

或者

myList[[i.attr for i in myList].index(2)]
Run Code Online (Sandbox Code Playgroud)

做到这一点的最佳方法是什么,是否有更好的解决方案?(如果可以,因为我是 Python 初学者,请回答不同解决方案的优缺点,将不胜感激)。(Rq:这个例子很简单,列表可以更大,对象更复杂)

谢谢你的回答。

kay*_*ya3 7

如果您确定列表包含具有该属性的对象,则可以使用以下内容:

result = next(obj for obj in my_list if obj.attr == 2)
Run Code Online (Sandbox Code Playgroud)

StopIteration如果没有找到这样的对象,则会引发上述问题,这可能是不可取的,尤其是如果代码出现在某个地方,aStopIteration会发出信号以指示其他循环停止。为了优雅地处理找不到对象的情况,您可以提供要返回的默认值:

result = next((obj for obj in my_list if obj.attr == 5), None)
Run Code Online (Sandbox Code Playgroud)

如果这看起来很笨拙,那是因为列表并不真正用于此目的。如果您希望能够轻松(且有效地)通过对象的一个​​属性来查找对象,请改用字典,并将该属性设为键。

my_dict = {obj.attr: obj for obj in my_list}

# raises KeyError if no such object exists
result = my_dict[2]

# returns None if no such object exists
result = my_dict.get(2)
Run Code Online (Sandbox Code Playgroud)