我遇到过这个:
item = someSortOfSelection() if item in myList: doMySpecialFunction(item)
但有时它不适用于我的所有项目,就好像它们在列表中未被识别(当它是字符串列表时)。
这是在列表中查找项目的最“pythonic”方式吗:if x in l:?
if x in l:
至于您的第一个问题:该代码非常好,如果item等于其中的一个元素,则应该可以工作myList。也许您试图找到一个与其中一项不 完全 匹配的字符串,或者您正在使用一个不准确的浮点值。
item
myList
至于你的第二个问题:如果在列表中“找到”东西,实际上有几种可能的方法。
这是您描述的用例:检查列表中是否包含某些内容。如您所知,您可以使用in运算符:
in
3 in [1, 2, 3] # => True
即查找序列中满足某个条件的所有元素。您可以为此使用列表理解或生成器表达式:
matches = [x for x in lst if fulfills_some_condition(x)] matches = (x for x in lst if x > 6)
后者将返回一个 生成器 ,您可以将其想象为一种惰性列表,只有在您迭代它时才会构建它。顺便说一句,第一个完全等同于
matches = filter(fulfills_some_condition, lst)
在 Python 2 中。在这里您可以看到正在工作的高阶函数。在 Python 3 中,filter不返回列表,而是返回类似生成器的对象。
filter
如果您只想要与条件匹配的第一件事(但您还不知道它是什么),则可以使用 for 循环(也可能使用else子句,这并不是众所周知的)。你也可以使用
else
next(x for x in lst if ...)
StopIteration如果没有找到,它将返回第一个匹配项或引发 a 。或者,您可以使用
StopIteration
next((x for x in lst if ...), [default value])
对于列表,如果您想知道 某个元素在列表中的位置index,有时还有一种方法很有用: __
index
[1,2,3].index(2) # => 1 [1,2,3].index(4) # => ValueError
但是,请注意,如果您有重复项,则.index始终返回最低索引:......
.index
[1,2,3,2].index(2) # => 1
如果有重复并且您想要所有索引,那么您可以使用enumerate():
enumerate()
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]