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

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


当前回答

有索引方法,i = array.index(value),但我不认为你可以指定一个自定义比较运算符。不过,编写自己的函数来实现这一点并不难:

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

其他回答

最好的方法可能是使用列表方法。index。

对于列表中的对象,你可以这样做:

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

您需要的任何特殊处理。

你也可以在enumerate(arr)中使用for/in语句

使用实例查找值为> 100的项的索引。

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

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

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

Or:

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

我使用function返回匹配元素的索引(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")

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

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

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

有索引方法,i = array.index(value),但我不认为你可以指定一个自定义比较运算符。不过,编写自己的函数来实现这一点并不难:

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