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] |
有
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方法将为您做到这一点。如果要保证订单,请首先使用
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] |