Python:在列表中查找

Python:在列表中查找,python,find,Python,Find,我遇到过这样的情况: item = someSortOfSelection() if item in myList: doMySpecialFunction(item) 但有时它并不适用于我的所有项目,好像它们在列表中没有被识别(当它是一个字符串列表时) 这是在列表中查找项目的最“python”的方法吗:如果l中的x:?至于你的第一个问题:如果item等于myList中的一个元素,那么该代码就很好用了。可能您试图找到一个与其中一项不完全匹配的字符串,或者可能您使用的浮点值不准确 至于你

我遇到过这样的情况:

item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)
但有时它并不适用于我的所有项目,好像它们在列表中没有被识别(当它是一个字符串列表时)


这是在列表中查找项目的最“python”的方法吗:
如果l中的x:

至于你的第一个问题:如果
item
等于
myList
中的一个元素,那么该代码就很好用了。可能您试图找到一个与其中一项不完全匹配的字符串,或者可能您使用的浮点值不准确

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

检查里面是否有东西 这就是您描述的用例:检查列表中是否有内容。如您所知,您可以在操作符中使用

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)
筛选集合 也就是说,查找序列中满足特定条件的所有元素。您可以使用列表理解或生成器表达式:

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中,
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
first_or_default = next((x for x in lst if ...), None)
但是,请注意,如果有重复项,
.index
始终返回最低的索引:

[1,2,3,2].index(2) # => 1
如果存在重复项并且需要所有索引,则可以使用
enumerate()

[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]

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

[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
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])

查找第一个事件

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  

在处理字符串列表时,您可能希望使用两种可能的搜索之一:

  • 如果列表元素等于某个项目('example') [‘一’、‘举例’、‘两’]):

    if项目在您的\u列表中:某些\u函数在\u true()上。

    ['one'、'ex'、'two']中的'ex'=>True

    ['one'、'ex'、'two']中的'ex_1'=>False

  • 如果列表元素相似,则在 [one、'example'、'two'或'example_1'在 [‘一’、‘举例’、‘两’]):

    matches=[如果el中有项目,则el代表您列表中的el]

    matches=[el代表项目中的el时,列表中的el]

    然后只需检查
    len(匹配项)
    ,或者根据需要阅读它们


  • 另一种选择:如果列表中的项目:
    ,则可以使用
    检查列表中是否有项目,但这是顺序O(n)。如果您处理的是大型项目列表,您只需要知道某个项目是否属于您的列表中的一员,您可以先将列表转换为集合,然后利用:

    并非在所有情况下都是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能


    请注意,使用
    set(my_list)
    创建集合也是O(n),因此,如果只需要执行一次,那么这样做不会更快。如果您需要重复检查成员身份,那么在初始集合创建之后,每次查找都将是O(1)。

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

    定义和用法

    count()
    方法返回具有指定值的元素数

    语法

    list.count(value)
    
    示例:

    fruits = ['apple', 'banana', 'cherry']
    
    x = fruits.count("cherry")
    
    item = someSortOfSelection()
    
    if myList.count(item) >= 1 :
    
        doMySpecialFunction(item)
    
    问题示例:

    fruits = ['apple', 'banana', 'cherry']
    
    x = fruits.count("cherry")
    
    item = someSortOfSelection()
    
    if myList.count(item) >= 1 :
    
        doMySpecialFunction(item)
    

    如果您要检查一次收藏品中是否存在值,则可以使用“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}")
    

    这很好,如果item等于
    myList
    中的一个元素,它应该可以工作。你是说这是一种很好的方法吗?在我的几次试验中,可能有空格和换行符插入。。。我只是想确定这是实现“在列表中查找”的好方法(一般来说)Stephane:让我换一句话:
    如果列表中的x
    不是人们抱怨的内置函数。他们抱怨说,没有明确的方法来解决这个问题