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:这个例子很简单,列表可以更大,对象更复杂)
谢谢你的回答。
如果您确定列表包含具有该属性的对象,则可以使用以下内容:
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)
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |