python:在列表中查找元素

Python: finding an element in a list

本问题已经有最佳答案,请猛点这里访问。

在python中,在列表中查找元素索引的好方法是什么?请注意,列表可能没有排序。

是否有方法指定要使用的比较运算符?


从潜入Python:

1
2
3
4
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5


如果只想确定元素是否包含在列表中:

1
2
3
4
5
6
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False


最好的方法可能是使用list方法.index。

对于列表中的对象,可以执行以下操作:

1
2
def __eq__(self, other):
    return self.Value == other.Value

你需要的任何特殊处理。

还可以将for/in语句与enumerate(arr)一起使用

查找值大于100的项的索引的示例。

1
2
3
for index, item in enumerate(arr):
    if item > 100:
        return index, item

来源


这是使用列表理解的另一种方法(有些人可能会发现它有争议)。对于简单的测试来说,它是非常容易实现的,例如对象属性的比较(我需要很多):

1
el = [x for x in mylist if x.attr =="foo"][0]

当然,这假设了列表中合适元素的存在(实际上是唯一性)。


假设您想在numpy数组中找到一个值,我想像这样的事情可能会奏效:

1
Numpy.where(arr=="value")[0]


index方法,i = array.index(value)方法,但我认为您不能指定自定义比较运算符。尽管如此,编写自己的函数并不困难:

1
2
3
4
def custom_index(array, compare_function):
    for i, v in enumerate(array):
        if compare_function(v):
            return i


我使用函数返回匹配元素(python 2.6)的索引:

1
2
def index(l, f):
     return next((i for i in xrange(len(l)) if f(l[i])), None)

然后通过lambda函数使用它,通过任何所需的公式(例如使用元素名称)检索所需的元素。

1
element = mylist[index(mylist, lambda item: item["name"] =="my name")]

如果我需要在代码中的几个地方使用它,我只需定义特定的查找函数,例如按名称查找元素:

1
2
def find_name(l, name):
     return l[index(l, lambda item: item["name"] == name)]

然后很容易阅读:

1
element = find_name(mylist,"my name")

列表的index方法将为您做到这一点。如果要保证订单,请首先使用sorted()对列表进行排序。sorted接受一个cmp或key参数来指定排序的方式:

1
2
a = [5, 4, 3]
print sorted(a).index(5)

或:

1
2
a = ['one', 'aardvark', 'a']
print sorted(a, key=len).index('a')

我是通过穿芭蕾短裙找到这个的。感谢谷歌,感谢你们所有人;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def findall(L, test):
    i=0
    indices = []
    while(True):
        try:
            # next value in list passing the test
            nextvalue = filter(test, L[i:])[0]

            # add index of this value in the index list,
            # by searching the value in L[i:]
            indices.append(L.index(nextvalue, i))

            # iterate i, that is the next index from where to search
            i=indices[-1]+1
        #when there is no further"good value", filter returns [],
        # hence there is an out of range exeption
        except IndexError:
            return indices

非常简单的用法:

1
2
3
4
a = [0,0,2,1]
ind = findall(a, lambda x:x>0))

[2, 3]

P.S.scuse我的英语


这个怎么样?

1
2
def global_index(lst, test):
    return ( pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1]) )

用途:

1
2
3
4
>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3)
<generator object <genexpr> at ...>
>>> list(_)
[3, 4, 5]