根据属性值在对象列表中获取对象引用的最佳方法
Best way to get object reference in object list based on attribute value
考虑以下 class:
class MyClass():
def __init__(self,attr):
self.attr=attr
和 MyClass 对象列表:
myList=[MyClass(1),MyClass(2),MyClass(3)]
属性值是唯一的。为了获取具有特定值(例如:2)的对象的引用,我使用了
[i for i in myList if i.attr==2][0]
或
myList[[i.attr for i in myList].index(2)]
最好的方法是什么?是否有更好的解决方案? (如果可以的话,因为我是 python 初学者,请回答不同解决方案的优缺点,我们将不胜感激)。
(Rq:这个例子很简单,列表可以更大,对象更复杂)
感谢您的回答。
如果您确定列表中包含具有该属性的对象,您可以使用以下方法:
result = next(obj for obj in my_list if obj.attr == 2)
如果没有找到这样的对象,上面会引发 StopIteration
,这可能是不可取的,特别是如果代码出现在 StopIteration
会发出其他循环停止信号的地方。为了优雅地处理找不到对象的情况,您可以提供一个要返回的默认值:
result = next((obj for obj in my_list if obj.attr == 5), None)
如果这看起来很笨拙,那是因为列表并不是真正用于此目的。如果您希望能够轻松地(高效地)通过对象的某个属性查找对象,请改用字典,并将该属性作为键。
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)
考虑以下 class:
class MyClass():
def __init__(self,attr):
self.attr=attr
和 MyClass 对象列表:
myList=[MyClass(1),MyClass(2),MyClass(3)]
属性值是唯一的。为了获取具有特定值(例如:2)的对象的引用,我使用了
[i for i in myList if i.attr==2][0]
或
myList[[i.attr for i in myList].index(2)]
最好的方法是什么?是否有更好的解决方案? (如果可以的话,因为我是 python 初学者,请回答不同解决方案的优缺点,我们将不胜感激)。 (Rq:这个例子很简单,列表可以更大,对象更复杂)
感谢您的回答。
如果您确定列表中包含具有该属性的对象,您可以使用以下方法:
result = next(obj for obj in my_list if obj.attr == 2)
如果没有找到这样的对象,上面会引发 StopIteration
,这可能是不可取的,特别是如果代码出现在 StopIteration
会发出其他循环停止信号的地方。为了优雅地处理找不到对象的情况,您可以提供一个要返回的默认值:
result = next((obj for obj in my_list if obj.attr == 5), None)
如果这看起来很笨拙,那是因为列表并不是真正用于此目的。如果您希望能够轻松地(高效地)通过对象的某个属性查找对象,请改用字典,并将该属性作为键。
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)