Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于属性值在对象列表中获取对象引用的最佳方法_Python_List Comprehension - Fatal编程技术网

Python 基于属性值在对象列表中获取对象引用的最佳方法

Python 基于属性值在对象列表中获取对象引用的最佳方法,python,list-comprehension,Python,List Comprehension,考虑到以下类别: class MyClass(): def __init__(self,attr): self.attr=attr 以及MyClass对象的列表: myList=[MyClass(1),MyClass(2),MyClass(3)] 属性值是唯一的。为了获得具有特定值的对象引用(例如:2),我使用 或 最好的方法是什么?有没有更好的解决方案?(如果可以,因为我是python初学者,请回答不同解决方案的优缺点,我将不胜感激)。 (Rq:这个示例非常简单,列

考虑到以下类别:

class MyClass():
    def __init__(self,attr):
        self.attr=attr
以及MyClass对象的列表:

myList=[MyClass(1),MyClass(2),MyClass(3)]
属性值是唯一的。为了获得具有特定值的对象引用(例如:2),我使用

最好的方法是什么?有没有更好的解决方案?(如果可以,因为我是python初学者,请回答不同解决方案的优缺点,我将不胜感激)。 (Rq:这个示例非常简单,列表可能更大,对象可能更复杂)


感谢您的回答。

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

result=next(如果obj.attr==2,则我的_列表中的obj对应于obj)
如果未找到此类对象,则上述操作将引发
StopIteration
,这可能是不可取的,尤其是当代码出现在
StopIteration
会发出信号让其他循环停止的地方时。要优雅地处理找不到对象的情况,可以提供要返回的默认值:

result=next((如果obj.attr==5,则我的_列表中的obj对应于obj),无)
如果这看起来很笨拙,那是因为列表并不是真正用于此目的的。如果希望能够通过对象的某个属性轻松(高效)地查找对象,请改用字典,并将该属性作为键

my_dict={obj.attr:obj for obj in my_list}
#如果不存在此类对象,则引发KeyError
结果=我的字典[2]
#如果不存在这样的对象,则返回None
结果=my_dict.get(2)

如果确定列表中包含具有该属性的对象,可以使用以下选项:

result=next(如果obj.attr==2,则我的_列表中的obj对应于obj)
如果未找到此类对象,则上述操作将引发
StopIteration
,这可能是不可取的,尤其是当代码出现在
StopIteration
会发出信号让其他循环停止的地方时。要优雅地处理找不到对象的情况,可以提供要返回的默认值:

result=next((如果obj.attr==5,则我的_列表中的obj对应于obj),无)
如果这看起来很笨拙,那是因为列表并不是真正用于此目的的。如果希望能够通过对象的某个属性轻松(高效)地查找对象,请改用字典,并将该属性作为键

my_dict={obj.attr:obj for obj in my_list}
#如果不存在此类对象,则引发KeyError
结果=我的字典[2]
#如果不存在这样的对象,则返回None
结果=my_dict.get(2)

您可以将对象放在dict中,以其属性值作为键。使用常规循环,不要使用列表。如果要按属性从列表中检索多个元素,我建议按照@khelwood的建议将它们组织到字典中。字典允许在完成构建字典的初始工作后,通过目标值进行快速检索。如果你只想检索一个元素,看看这里的解决方案:你可以把你的对象放在一个dict中,把它们的属性值作为键。使用常规循环,不要使用列表。如果要按属性从列表中检索多个元素,我建议按照@khelwood的建议将它们组织到字典中。字典允许在完成构建字典的初始工作后,通过目标值进行快速检索。如果只检索单个元素,请查看以下解决方案:
[i for i in myList if i.attr==2][0]
myList[[i.attr for i in myList].index(2)]