Python: Find in list

后端 未结 10 881
故里飘歌
故里飘歌 2020-11-22 10:15

I have come across this:

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

but sometimes it does not work with

10条回答
  •  暖寄归人
    2020-11-22 10:51

    As for your first question: that code is perfectly fine and should work if item equals one of the elements inside myList. Maybe you try to find a string that does not exactly match one of the items or maybe you are using a float value which suffers from inaccuracy.

    As for your second question: There's actually several possible ways if "finding" things in lists.

    Checking if something is inside

    This is the use case you describe: Checking whether something is inside a list or not. As you know, you can use the in operator for that:

    3 in [1, 2, 3] # => True
    

    Filtering a collection

    That is, finding all elements in a sequence that meet a certain condition. You can use list comprehension or generator expressions for that:

    matches = [x for x in lst if fulfills_some_condition(x)]
    matches = (x for x in lst if x > 6)
    

    The latter will return a generator which you can imagine as a sort of lazy list that will only be built as soon as you iterate through it. By the way, the first one is exactly equivalent to

    matches = filter(fulfills_some_condition, lst)
    

    in Python 2. Here you can see higher-order functions at work. In Python 3, filter doesn't return a list, but a generator-like object.

    Finding the first occurrence

    If you only want the first thing that matches a condition (but you don't know what it is yet), it's fine to use a for loop (possibly using the else clause as well, which is not really well-known). You can also use

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

    which will return the first match or raise a StopIteration if none is found. Alternatively, you can use

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

    Finding the location of an item

    For lists, there's also the index method that can sometimes be useful if you want to know where a certain element is in the list:

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

    However, note that if you have duplicates, .index always returns the lowest index:......

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

    If there are duplicates and you want all the indexes then you can use enumerate() instead:

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

提交回复
热议问题