1

我有以下类型的列表:

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等于“无”的这些实例中的第一个的位置。

由于我的列表很长,算法不应该探索整个列表,但它应该在找到条件(在我的示例中,属性aequals None)后立即停止。

在上面的例子中,这个算法的答案应该是 3。

4

2 回答 2

6

使用生成器表达式和next

next((i for i, item in enumerate(l) if item.a is None), None)

This would return None if no such item is found.

Demo:

>>> 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
于 2013-08-26T15:57:48.383 回答
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

这会创建一个生成器对象,因此它只会有效地扩展您当前正在检查的元素,并且一旦您找到匹配的目标,就会在迭代中短路。

于 2013-08-26T15:55:56.253 回答