我遇到了这个:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
但有时它不适用于我的所有项目,好像它们在列表中没有被识别(当它是字符串列表时)。
这是在列表中查找项目的最 “pythonic” 方式: if x in l:
吗?
关于您的第一个问题:该代码非常好,如果item
myList
中的元素之一,则该代码应该可以正常工作。也许您试图找到与其中一项不完全匹配的字符串,或者您使用的浮点值会导致不正确。
至于第二个问题:如果 “查找” 列表中的内容,实际上有几种可能的方法。
这是您描述的用例:检查列表中是否包含某些内容。如您所知,您可以使用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
不会返回列表,而是一个类似生成器的对象。
如果您只想匹配条件的第一件事(但是您还不知道它是什么),那么可以使用 for 循环(可能也使用else
子句,这并不是很知名)。您也可以使用
next(x for x in lst if ...)
如果没有找到匹配项,它将返回第一个匹配项或引发StopIteration
或者,您可以使用
next((x for x in lst if ...), [default value])
对于名单,也就是该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 enumerate([1,2,3,2]) if x==2] # => [1, 3]
如果要查找一个元素,或者要next
使用默认值,请选择None
,如果在列表中未找到该元素,则不会引发StopIteration
first_or_default = next((x for x in lst if ...), None)
虽然 Niklas B. 的答案非常全面,但是当我们想在列表中查找某项时,有时获得其索引会很有用:
next((i for i, x in enumerate(lst) if [condition on x]), [default value])