Python:在列表中查找

  • 问题:
  • 我遇到过这样的情况:

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

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

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

  • 答案:
  • 至于你的第一个问题:如果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)

    在python2中。在这里可以看到高阶函数在工作。在Python3中,filter不返回列表,而是一个类似生成器的对象

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

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

    它将返回第一个匹配项,如果找不到任何匹配项,则引发一个stopitration。或者,您可以使用

    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]