Filtering a list based on a list of booleans

后端 未结 6 1200
清歌不尽
清歌不尽 2020-11-27 10:14

I have a list of values which I need to filter given the values in a list of booleans:

list_a = [1, 2, 4, 6]
filter = [True, False, True, False]
6条回答
  •  时光取名叫无心
    2020-11-27 11:09

    You're looking for itertools.compress:

    >>> from itertools import compress
    >>> list_a = [1, 2, 4, 6]
    >>> fil = [True, False, True, False]
    >>> list(compress(list_a, fil))
    [1, 4]
    

    Timing comparisons(py3.x):

    >>> list_a = [1, 2, 4, 6]
    >>> fil = [True, False, True, False]
    >>> %timeit list(compress(list_a, fil))
    100000 loops, best of 3: 2.58 us per loop
    >>> %timeit [i for (i, v) in zip(list_a, fil) if v]  #winner
    100000 loops, best of 3: 1.98 us per loop
    
    >>> list_a = [1, 2, 4, 6]*100
    >>> fil = [True, False, True, False]*100
    >>> %timeit list(compress(list_a, fil))              #winner
    10000 loops, best of 3: 24.3 us per loop
    >>> %timeit [i for (i, v) in zip(list_a, fil) if v]
    10000 loops, best of 3: 82 us per loop
    
    >>> list_a = [1, 2, 4, 6]*10000
    >>> fil = [True, False, True, False]*10000
    >>> %timeit list(compress(list_a, fil))              #winner
    1000 loops, best of 3: 1.66 ms per loop
    >>> %timeit [i for (i, v) in zip(list_a, fil) if v] 
    100 loops, best of 3: 7.65 ms per loop
    

    Don't use filter as a variable name, it is a built-in function.

提交回复
热议问题