在Python中查找列表中匹配元素的索引

时间:2013-05-22 07:00:16

标签: python list indexing find

我有一长串的浮点数,范围从1到5,称为“平均值”,我想返回小于或大于b的元素的索引列表

def find(lst,a,b):
    result = []
    for x in lst:
        if x<a or x>b:
            i = lst.index(x)
            result.append(i)
    return result

matches = find(average,2,4)

但令人惊讶的是,“匹配”的输出中有很多重复,例如[2, 2, 10, 2, 2, 2, 19, 2, 10, 2, 2, 42, 2, 2, 10, 2, 2, 2, 10, 2, 2, ...]

为什么会这样?

3 个答案:

答案 0 :(得分:55)

您正在使用.index(),只会在列表中找到您的值的第一个出现次数。因此,如果索引2和索引9的值为1.0,则.index(1.0) 总是返回2,无论1.0出现多少次def find(lst, a, b): result = [] for i, x in enumerate(lst): if x<a or x>b: result.append(i) return result 清单。

使用enumerate()为索引添加索引:

def find(lst, a, b):
    return [i for i, x in enumerate(lst) if x<a or x>b]

您可以将其折叠为列表理解:

{{1}}

答案 1 :(得分:2)

这是一个相当沉重的依赖,但如果你做了很多这类事情,你应该考虑使用numpy

In [56]: import random, numpy

In [57]: lst = numpy.array([random.uniform(0, 5) for _ in xrange(1000)]) # example list

In [58]: a, b = 1, 3

In [59]: numpy.flatnonzero((lst > a) & (lst < b))[:10]
Out[59]: array([ 0, 12, 13, 15, 18, 19, 23, 24, 26, 29])

在回答Seanny123的问题时,我使用了这个计时代码:

import numpy, timeit, random

a, b = 1, 3

lst = numpy.array([random.uniform(0, 5) for _ in xrange(1000)])

def numpy_way():
    numpy.flatnonzero((lst > 1) & (lst < 3))[:10]

def list_comprehension():
    [e for e in lst if 1 < e < 3][:10]

print timeit.timeit(numpy_way)
print timeit.timeit(list_comprehension)

numpy版本的速度提高了60多倍。

答案 2 :(得分:-1)

>>> average =  [1,3,2,1,1,0,24,23,7,2,727,2,7,68,7,83,2]
>>> matches = [i for i in range(0,len(average)) if average[i]<2 or average[i]>4]
>>> matches
[0, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15]
相关问题