<p>你可以在列表中完成。这基本上与您的代码相同,但压缩为一行,它构建了一个符合条件的结果列表</p>
<p>第一种方法获得所有匹配项</p>
<pre><code>mylist = [-1,-2,3,4,5,6]
results = [(i, el) for i, el in enumerate(mylist) if el > 0]
</code></pre>
<p>另一种方法是使用可能更快的生成器表达式,然后将其解包。这是第一个</p>
<pre><code>*next((i, el) for i, el in enumerate(mylist) if el > 0))
</code></pre>
<p>这将循环列表并检查条件,然后将索引和元素放入元组中。在括号内这样做会使它变成一个生成器,速度快得多,因为它实际上不需要在内存中保存所有内容,它只会根据需要生成响应。使用<code>next()</code>可以遍历它们。因为我们在这里只使用next()一次,所以它只生成第一个匹配项。然后我们用<code>*</code>解压它</p>
<p>由于这里还有另外两个有效答案,我决定使用timeit模块对每个答案进行计时并发布结果。为了清楚起见,我还对OP的方法进行了计时。以下是我的发现:</p>
<pre><code>import timeit
# Method 1 Generator Expression
print(timeit.timeit('next((i, el) for i, el in enumerate([-1,-2,3,4,5,6]) if el > 0)', number=100000))
0.007089499999999999
# Method 2 Getting index of True
print(timeit.timeit('list(x > 0 for x in [-1,-2,3,4,5,6]).index(True)', number=100000))
0.008104599999999997
# Method 3 filter and lambda
print(timeit.timeit('myidx , myel = list(filter(lambda el: el[1] > 0, enumerate([-1,-2,3,4,5,6])))[0]', number=100000))
0.0155314
statement = """
for idx, el in enumerate([-1,-2,3,4,5,6]):
if el > 0:
myidx, myel = idx, el
break
"""
print(timeit.timeit(statement, number=100000))
0.04074070000000002
</code></pre>