协慌网

登录 贡献 社区

Python:在列表中查找

我遇到了这个:

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])