查找列表中的第一个元素和索引匹配条件

2024-09-28 20:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑这个简单的例子

mylist = [-1,-2,3,4,5,6]

for idx, el in enumerate(mylist):
    if el > 0:
        myidx, myel = idx, el
        break

myidx, myel
Out[20]: (2, 3)

我感兴趣的是在python列表中查找与特定条件匹配的第一个索引和相应的第一个元素(这里,这只是>;0)

在上面的代码中,我使用enumerate循环元素,然后使用if子句查找正确的元素。我觉得这很麻烦。有更好的方法吗?例如,使用本机python函数

谢谢


Tags: in元素列表forifoutel感兴趣
3条回答

像这样的方法应该会奏效:

l = [-1,-2,3,4,5,6]
list(x > 0 for x in l).index(True)
# Output: 2

为了找到所有模式,我们可以使用python内置函数

from itertools import filterfalse
f = filterfalse(lambda x: x[1] <= 0, enumerate(l))
print(list(f))
# [(2, 1), (3, 2), (4, 3)]

你可以在列表中完成。这基本上与您的代码相同,但压缩为一行,它构建了一个符合条件的结果列表

第一种方法获得所有匹配项

mylist = [-1,-2,3,4,5,6]

results = [(i, el) for i, el in enumerate(mylist) if el > 0]

另一种方法是使用可能更快的生成器表达式,然后将其解包。这是第一个

*next((i, el) for i, el in enumerate(mylist) if el > 0))

这将循环列表并检查条件,然后将索引和元素放入元组中。在括号内这样做会使它变成一个生成器,速度快得多,因为它实际上不需要在内存中保存所有内容,它只会根据需要生成响应。使用next()可以遍历它们。因为我们在这里只使用next()一次,所以它只生成第一个匹配项。然后我们用*解压它

由于这里还有另外两个有效答案,我决定使用timeit模块对每个答案进行计时并发布结果。为了清楚起见,我还对OP的方法进行了计时。以下是我的发现:

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

您可以像这样使用lambdafilter的组合:

mylist = [-1,-2,3,4,5,6]

myidx, myel = list(filter(lambda el: el[1] > 0, enumerate(mylist)))[0]
print("({}, {})".format(myidx, myel))

说明:

filter()函数提供了一种优雅的方式来过滤掉所有元素,它将函数和列表作为参数。这里是lambdamylist。因为您想要获得相应的索引,所以我们需要使用enumerate来结束enumerate(mylist)

基本上,enumerate(mylist)返回索引和相应值的元组。这里的条件是值和0之间的比较,这就是为什么我们得到el[1]而不是el[0]来与0进行比较

结果将被转换为list。此列表包括满足我们条件的所有对(index, value)。这里我们想要得到第一对,这就是为什么我们在末尾有[0]

输出:

(2, 3)

相关问题 更多 >