我使用以下方法检查项目是否在my_list中:

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

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

编辑:这个问题被认为是重复的,但我并不完全相信:这里这个问题大致上是“在列表中查找元素的最Python方式是什么”。这个问题的第一个答案在所有Python方法中都非常广泛。

而在链接的重复问题及其对应的答案上,重点大致仅限于Python中的“in”关键字。与目前的问题相比,我认为这确实是一个限制。

我认为当前问题的答案比拟议的重复问题/答案更为相关和详细。


当前回答

至于您的第一个问题:“如果item在my_list中:”非常好,如果item等于my_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中。在这里你可以看到高阶函数在起作用。在Python3中,过滤器不返回列表,而是返回类似生成器的对象。

查找第一个事件

如果你只想要第一个匹配条件的东西(但你还不知道它是什么),可以使用for循环(也可以使用else子句,这不是很有名)。您也可以使用

next(x for x in lst if ...)

如果没有找到匹配项,则返回第一个匹配项或引发StopIteration。或者,您可以使用

next((x for x in lst if ...), [default value])

查找项目的位置

对于列表,如果您想知道某个元素在列表中的位置,也可以使用索引方法:

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

其他回答

至于您的第一个问题:“如果item在my_list中:”非常好,如果item等于my_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中。在这里你可以看到高阶函数在起作用。在Python3中,过滤器不返回列表,而是返回类似生成器的对象。

查找第一个事件

如果你只想要第一个匹配条件的东西(但你还不知道它是什么),可以使用for循环(也可以使用else子句,这不是很有名)。您也可以使用

next(x for x in lst if ...)

如果没有找到匹配项,则返回第一个匹配项或引发StopIteration。或者,您可以使用

next((x for x in lst if ...), [default value])

查找项目的位置

对于列表,如果您想知道某个元素在列表中的位置,也可以使用索引方法:

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

虽然Niklas B.给出的答案非常全面,但当我们想在列表中查找某个项目时,有时获取其索引会很有用:

next((i for i, x in enumerate(lst) if [condition on x]), [default value])

如果您想在next中查找一个元素或None使用默认值,如果在列表中找不到该项,则不会引发StopIteration:

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

如果您要检查一次集合中是否存在值,那么可以使用“in”运算符。然而,如果您要检查不止一次,那么我建议使用平分模块。请记住,使用平分模块数据必须进行排序。因此,您对数据进行一次排序,然后可以使用二等分。在我的机器上使用平分模块比使用“in”运算符快大约12倍。

以下是使用Python 3.8及以上语法的代码示例:

import bisect
from timeit import timeit

def bisect_search(container, value):
    return (
      (index := bisect.bisect_left(container, value)) < len(container) 
      and container[index] == value
    )

data = list(range(1000))
# value to search
true_value = 666
false_value = 66666

# times to test
ttt = 1000

print(f"{bisect_search(data, true_value)=} {bisect_search(data, false_value)=}")

t1 = timeit(lambda: true_value in data, number=ttt)
t2 = timeit(lambda: bisect_search(data, true_value), number=ttt)

print("Performance:", f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")

输出:

bisect_search(data, true_value)=True bisect_search(data, false_value)=False
Performance: t1=0.0220, t2=0.0019, diffs t1/t2=11.71

检查字符串列表中的项目中是否没有额外的/不需要的空白。这是一个可能会干扰解释找不到项目的原因。