Python:在列表中查找

2022-09-05 01:20:42

我使用以下来检查是否在:itemmy_list

if item in my_list:
    print("Desired item is in list")

但有时,它找不到该项目。这是为什么呢?


“”是在列表中查找项目的最“pythonic”方式吗?if item in my_list:


答案 1

至于你的第一个问题:“”是完全没问题的,如果等于里面的元素之一,应该工作。该项目必须与列表中的某个项目完全匹配。例如,不匹配。特别是浮点值可能会受到不准确的影响。例如。if item is in my_list:itemmy_list"abc""ABC"1 - 1/3 != 2/3

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

检查里面有没有东西

这是您描述的用例:检查列表中是否有某些内容。如您所知,您可以使用运算符: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 ...)

这将返回第一个匹配项,如果未找到任何匹配项,则引发 a。或者,您可以使用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]

答案 2

如果要查找一个元素或在 中使用 default,则在 列表中找不到该项目时,它不会引发:NonenextStopIteration

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