我有以下类型的列表:
class Any(object):
def __init__(self,a,b):
self.a=a
self.b=b
l=[Any(1,3),Any(2,4),Any(1,2),Any(None,6),Any('hello',6), Any(1,'ChuckNorris'),Any(1,2)]
l
是一个仅包含Any
个实例的列表。我想找到第一个属性a
等于'无'的实例的位置。
由于我的列表很长,算法不应该浏览整个列表,但是一旦找到条件(在我的示例中,属性a
等于None
),它就应该停止。
在上面的例子中,这个算法的答案应该是3。
答案 0 :(得分:6)
使用生成器表达式和next
:
next((i for i, item in enumerate(l) if item.a is None), None)
如果找不到这样的项目,这将返回None
。
<强>演示:强>
>>> l=[Any(1,3),Any(2,4),Any(1,2),Any(None,6),Any('hello',6), Any(1,'ChuckNorris'),Any(1,2)]
>>> next((i for i, item in enumerate(l) if item.a is None), None)
3
答案 1 :(得分:4)
try:
answer = next((val for val in enumerate(l) if val[1].a is None))[0]
except StopIteration:
# No element matching condition in sequence
answer = None
这会创建一个生成器对象,因此它只会扩展您当前正在检查的元素,一旦找到匹配的目标,就会在迭代之外发生短路。