在Python中找到列表中元素的索引的好方法是什么? 注意,列表可能没有排序。
是否有方法指定要使用的比较运算符?
在Python中找到列表中元素的索引的好方法是什么? 注意,列表可能没有排序。
是否有方法指定要使用的比较运算符?
当前回答
我通过改编一些教程发现了这一点。感谢谷歌,也感谢你们所有人;)
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]
附言:抱歉我的英语不好
其他回答
我通过改编一些教程发现了这一点。感谢谷歌,也感谢你们所有人;)
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]
附言:抱歉我的英语不好
最好的方法可能是使用列表方法。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
源
有索引方法,i = array.index(value),但我不认为你可以指定一个自定义比较运算符。不过,编写自己的函数来实现这一点并不难:
def custom_index(array, compare_function):
for i, v in enumerate(array):
if compare_function(v):
return i
下面是另一种使用列表理解的方法(有些人可能会觉得有争议)。对于简单的测试,例如比较对象属性(我需要很多)是非常容易的:
el = [x for x in mylist if x.attr == "foo"][0]
当然,这假设列表中存在一个合适的元素(实际上是惟一性)。
列表的索引方法将为您完成此工作。如果想要保证顺序,请先使用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')