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

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

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

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

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

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


当前回答

如果您要检查一次集合中是否存在值,那么可以使用“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

其他回答

查找第一个事件

itertools中有一个解决方案:

def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)

例如,以下代码查找列表中的第一个奇数:

>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3  

您可以复制/粘贴它或安装更多itertools

pip3 install more-itertools

其中该配方已经包括在内。

用于_操作

def for_loop(l, target):
    for i in l:
        if i == target:
            return i
    return None


l = [1, 2, 3, 4, 5]
print(for_loop(l, 0))
print(for_loop(l, 1))
# None
# 1

next

def _next(l, target):
    return next((i for i in l if i == target), None)


l = [1, 2, 3, 4, 5]
print(_next(l, 0))
print(_next(l, 1))
# None
# 1

更多工具

more_itertools.first_true(可迭代,默认值=无,pred=无)

安装

pip install more-itertools

或直接使用

def first_true(iterable, default=None, pred=None):
    return next(filter(pred, iterable), default)
from more_itertools import first_true

l = [1, 2, 3, 4, 5]
print(first_true(l, pred=lambda x: x == 0))
print(first_true(l, pred=lambda x: x == 1))
# None
# 1

比较

method time/s
for_loop 2.77
next() 3.64
more_itertools.first_true() 3.82 or 10.86
import timeit
import more_itertools


def for_loop():
    for i in range(10000000):
        if i == 9999999:
            return i
    return None


def _next():
    return next((i for i in range(10000000) if i == 9999999), None)


def first_true():
    return more_itertools.first_true(range(10000000), pred=lambda x: x == 9999999)


def first_true_2():
    return more_itertools.first_true((i for i in range(10000000) if i == 9999999))


print(timeit.timeit(for_loop, number=10))
print(timeit.timeit(_next, number=10))
print(timeit.timeit(first_true, number=10))
print(timeit.timeit(first_true_2, number=10))
# 2.7730861
# 3.6409407000000003
# 10.869996399999998
# 3.8214487000000013

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

在处理字符串列表时,您可能需要使用以下两种可能的搜索之一:

如果列表元素等于项(“示例”位于[“一个”,“示例”,“两个”]):如果项目在您的列表中:some_function_on_true()['one','ex','wo']=>真['one','ex','wo'中的'ex_1'=>False如果列表元素像一个项目('ex'在['one,'example','wo']或'example_1'在[“一个”,“示例”,“两个”]):matches=[el for el in your_list if item in el]或matches=[el for el in your_list if el in item]然后只需检查len(匹配项)或根据需要读取它们。

如果在列表中找到x,则使用list.index(x)返回x的索引,如果找不到x,则返回#ValueError消息,您可以使用list.count(x)来返回列表中x的出现次数(验证x是否确实在列表中),否则返回0(如果没有x)。count()很酷的一点是它不会破坏代码,也不会在找不到x时要求抛出异常。