首页 文章

Python:在列表中查找

提问于
浏览
405

我遇到过这个:

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

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

这是查找列表中项目的最常用方式: if x in l:

9 回答

  • 131

    例如,如果要查找大于30的所有元素的索引:

    your_list = [11,22,23,44,55]
    filter(lambda x:your_list[x]>30,range(len(your_list)))
    
    #result: [3,4]
    
  • 6

    Finding the first occurrence

    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
    
  • 1
    list = [10, 20, 30, 40, 50]
    n = int(input("\nEnter a Number to search from the list : "))
    
    if n in list :
        print("\nMatch found")  
    else :
        print("\nMatch not found")
    
  • 0

    至于你的第一个问题:那个代码完全正常,如果 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)
    

    在Python 2中,您可以在这里看到高阶函数 . 在Python 3中, 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
    

    但请注意,如果您有重复项, .index 始终返回最低索引:......

    [1,2,3,2].index(2) # => 1
    

    如果有重复项并且您想要所有索引,则可以使用 enumerate() 代替:

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

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

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

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

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

    检查字符串列表中的项目中是否没有其他/不需要的白色空格 . 这是一个可能干扰解释无法找到的项目的原因 .

  • 0

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

    • 如果列表元素是 equal 到项目('example'在['one','example','two']):

    if item in your_list: some_function_on_true()

    '''','ex','two']中的'ex'=>真

    'ex_1'在['one','ex','two'] => False

    • 如果列表元素是 like 一个项目('ex'在['one,'示例','两个'] or ' example_1' is in ['一个','示例','两个']):

    matches = [el for el in your_list if item in el]

    要么

    matches = [el for el in your_list if el in item]

    然后只需检查 len(matches) 或根据需要阅读它们 .

  • 873

    另一种选择:您可以使用 if item in list: 检查项目是否在列表中,但这是订单O(n) . 如果您正在处理大项目列表,而您需要知道的是某些内容是否是列表的成员,您可以先将列表转换为集合并利用constant time set lookup

    my_set = set(my_list)
    if item in my_set:  # much faster on average than using a list
        # do something
    

    在每种情况下都不会是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能 .

    请注意,使用 set(my_list) 创建集合也是O(n),因此如果您只需要执行此操作,那么以这种方式执行此操作并不是更快 . 如果您需要重复检查成员资格,那么在初始集创建之后,每次查找都将为O(1) .

相关问题