Python:在列表中查找

我遇到了这个令人愉快的:

item = someSortOfSelection() if item in myList: doMySpecialFunction(item) 

但有时它不适用于我的所有项目,就好像它们在列表中不被识别(当它是一个string列表)。

它是在列表中find一个项目的最“pythonic”方式: if x in l: :?

至于你的第一个问题:该代码是完全正常的,应该工作,如果item等于myList中的元素myList 。 也许你试图find一个不完全匹配其中一个项目的string,也许你正在使用一个不准确的浮点值。

至于你的第二个问题:如果在列表中“发现”事实,实际上有几种可能的方法。

检查里面是否有东西

这是您描述的用例:检查列表中是否有内容。 如您所知,您可以使用in运算符:

 3 in [1, 2, 3] # => True 

过滤集合

也就是说,find满足一定条件的序列中的所有元素。 您可以使用列表理解或生成器expression式:

 matches = [x for x in lst if fulfills_some_condition(x)] matches = (x for x in lst if x > 6) 

后者将返回一个你可以想象成一种懒惰列表的生成器 ,只有当你遍历它时才会被构build。 顺便说一下,第一个是完全相同的

 matches = filter(fulfills_some_condition, lst) 

在Python 2.在这里你可以看到工作中的高阶函数。 在Python 3中, filter器不会返回一个列表,而是一个类似生成器的对象。

find第一个发生

如果你只想匹配一个条件的第一个东西(但是你不知道它是什么),那么使用for循环(可能使用else子句,这并不是真正公知的)也是可以的。 你也可以使用

 next(x for x in lst if ...) 

这将返回第一个匹配,或者如果没有find,则引发StopIteration 。 或者,您可以使用

 next((x for x in lst if ...), [default value]) 

find一个项目的位置

对于列表,还有一些index方法,如果您想知道列表中某个元素的位置,有时可能会有用。

 [1,2,3].index(2) # => 1 [1,2,3].index(4) # => ValueError 

但是,请注意,如果您有重复, .index始终返回最低的索引:……

 [1,2,3,2].index(2) # => 1 

如果有重复的,你想要所有的索引,那么你可以使用enumerate()来代替:

 [i for i,x in numerate([1,2,3,2]) if x==2] # => [1, 3] 

如果你想find一个元素或Nonenext使用default,如果在列表中找不到该项目,它将不会引发StopIteration

 first_or_default = next((x for x in lst if ...), None) 

虽然Niklas B.的答案非常全面,但是当我们想要在列表中find一个项目时,获取其索引有时很有用:

 next((i for i, x in enumerate(lst) if [condition on x]), [default value]) 

检查string列表中的项目是否有附加/不需要的白色空间。 这是一个干扰解释无法find的项目的原因。