Python: 在列表中查找

2024-04-23 09:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到过:

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

但有时它并不适用于我的所有项,好像它们在列表中无法识别(当它是一个字符串列表时)。

这是在列表中查找项的最“python”的方式吗:if x in l:


Tags: 字符串in列表if方式itemmylistsomesortofselection
3条回答

至于您的第一个问题:如果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]

如果要查找一个元素或Nonenext中使用默认值,则如果在列表中找不到该项,则不会引发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])

相关问题 更多 >