当前位置: 首页 > 面试题库 >

根据布尔值列表过滤列表

蒋烨然
2023-03-14
问题内容

我有一个值列表,需要根据给定的布尔值列表中的值进行过滤:

list_a = [1, 2, 4, 6]
filter = [True, False, True, False]

我使用以下行生成一个新的过滤列表:

filtered_list = [i for indx,i in enumerate(list_a) if filter[indx] == True]

结果是:

print filtered_list
[1,4]

这条线工作正常,但是(对我而言)看起来有点过大了,我想知道是否有更简单的方法来实现这一目标。

忠告

以下答案提供了两个好的建议:

1-不要filter像我一样命名列表,因为它是内置函数。

2-不要比较True像我做的事情,if filter[idx]==True..因为这是不必要的。只需使用if filter[idx]就足够了。


问题答案:

您正在寻找itertools.compress

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

时序比较(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

不要filter用作变量名,它是一个内置函数。



 类似资料:
  • 问题内容: 我有一个字典列表和每个字典的key(比方说)“型”,这可以有值,等我的目标是过滤掉这些字典到同一个字典列表,但只有一个的那些某些“类型”。我想我真的很在理解问题。 因此,示例列表如下所示: 我有一个键值列表。举例来说: 预期的结果列表如下所示: 我知道我可以用一组for循环来做到这一点。我知道必须有一个更简单的方法。我发现此问题有很多不同的风格,但没有一个完全符合要求并回答了这个问题。

  • 问题内容: 这可能只是白痴,但对我来说有点混乱: 为什么在返回时返回? 问题答案: 您正在根据布尔值的文字值检查它。一样不会是真的。 如果将其投射,您将看到区别: 究其原因是真实的,因为你是比较相同的对象。与或相同。 当您看到类似的东西并且此检查从未通过时,困难就来了。那是因为您正在检查项目的 真实值 。按照惯例,所有这些项目都将通过布尔检查失败- 也就是说,它们的布尔值将为: (明显) 任何空序

  • 问题内容: 我正在尝试使用作为df一部分的几个布尔变量来过滤df,但一直未能做到。 样本数据: C和D列的dtype是布尔值。我想仅使用C或D为True的行创建一个新的df(df1)。它看起来应该像这样: 我已经尝试过类似的事情,因为它无法处理布尔类型,因此会遇到问题: 有任何想法吗? 问题答案: In [82]: d Out[82]: A B C D 0 John Doe 45 True Fal

  • 我知道我可以测试列表是否为空,如下所示: 但我不明白为什么下一个代码不是等效的:

  • 我有一个物体,如下所示 给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型? 目前为止我有 但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。 例如 我会传入匹配类型B和子类型Z,所以我希望得到一个结果- 以下当前返回列表中的2个项目。 但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

  • 问题内容: jsfiddle http://jsfiddle.net/KfSBq/ 所谓子对象,是指我用ng-repeat显示的所有对象在其内部都包含一个对象列表,并且我希望根据这些子对象之一的属性进行过滤。 仅此一项就非常简单。我有个对象,每个对象都包含和对象列表: 我按类别显示它们: 我的问题是现在仍然显示不包含任何条目的日常对象。如何实现一种情况,如果过滤使列表为空,则该列表也不显示? 问题