Python:在列表中查找元素

时间:2009-03-03 01:45:03

标签: python list

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

有没有办法指定要使用的比较运算符?

10 个答案:

答案 0 :(得分:253)

来自Dive Into Python

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

答案 1 :(得分:137)

如果您只是想知道列表中是否包含元素:

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False

答案 2 :(得分:48)

最好的方法是使用list method .index

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

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

您需要任何特殊处理。

您还可以使用带枚举(arr)

的for / in语句

查找具有值>的项目的索引的示例100。

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

Source

答案 3 :(得分:27)

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

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

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

答案 4 :(得分:15)

假设您要在numpy数组中查找值, 我想这样的事情可能有用:

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

答案 5 :(得分:8)

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

def custom_index(array, compare_function):
    for i, v in enumerate(array):
        if compare_function(v):
            return i

答案 6 :(得分:5)

列表的索引方法将为您执行此操作。如果您想保证订单,请先使用sorted()对列表进行排序。 Sorted接受cmp或key参数来指示排序将如何发生:

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

或者:

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

答案 7 :(得分:5)

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

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

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

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

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

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

然后它非常简单易读:

element = find_name(mylist,"my name")

答案 8 :(得分:2)

我通过改编一些tutos找到了这个。感谢谷歌和所有人;)

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

一个非常简单的用法:

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

[2, 3]

P.S。请原谅我的英文

答案 9 :(得分:1)

这是怎么回事?

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

用法:

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