Filter a Python list by predicate

前端 未结 2 1712
花落未央
花落未央 2020-11-29 11:00

I would want to do something like:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.find(lambda x: x % 2 == 0)
2
>>> lst.findall(lambda x: x % 2          


        
相关标签:
2条回答
  • 2020-11-29 11:36

    You can use the filter method:

    >>> lst = [1, 2, 3, 4, 5]
    >>> filter(lambda x: x % 2 == 0, lst)
    [2, 4]
    

    or a list comprehension:

    >>> lst = [1, 2, 3, 4, 5]
    >>> [x for x in lst if x %2 == 0]
    [2, 4]
    

    to find a single element, you could try:

    >>> next(x for x in lst if x % 2 == 0)
    2
    

    Though that would throw an exception if nothing matches, so you'd probably want to wrap it in a try/catch. The () brackets make this a generator expression rather than a list comprehension.

    Personally though I'd just use the regular filter/comprehension and take the first element (if there is one).

    These raise an exception if nothing is found

    filter(lambda x: x % 2 == 0, lst)[0]
    [x for x in lst if x %2 == 0][0]
    

    These return empty lists

    filter(lambda x: x % 2 == 0, lst)[:1]
    [x for x in lst if x %2 == 0][:1]
    
    0 讨论(0)
  • 2020-11-29 11:36

    Generators and list comprehensions are more pythonic than chainable functions.

    >>> lst = [i for i in range(1, 6)]
    
    >>> lst
    [1, 2, 3, 4, 5]
    
    >>> gen = (x for x in lst if x % 10 == 0)
    
    >>> next(gen, 'not_found')
    'not_found'
    
    >>> [x for x in gen]
    []
    

    For example, I use it like this sometimes:

    >>> n = next((x for x in lst if x % 10 == 0), None)
    >>> if n is None:
    ...     print('Not found')
    ... 
    Not found
    

    Otherwise, you can define your utility function oneliners like this:

    >>> find = lambda fun, lst: next((x for x in lst if fun(x)), None)
    >>> find(lambda x: x % 10 == 0, lst)
    >>> find(lambda x: x % 5 == 0, lst)
    5
    
    >>> findall = lambda fun, lst: [x for x in lst if fun(x)]
    >>> findall(lambda x: x % 5 == 0, lst)
    [5]
    
    0 讨论(0)
提交回复
热议问题