【问题标题】:Python List comprehension: Add Element to a list if condition in another list (with same length) is truePython列表理解:如果另一个列表(具有相同长度)中的条件为真,则将元素添加到列表中
【发布时间】:2021-12-08 20:16:42
【问题描述】:

假设我有一个数组:

a =  [0.42, 0.18, 1.54, 2.9, 1.81, 2.35, 0.18, 1.54, 2.92]

具有以下(逐元素)逻辑状态:

[False, True, False, False, False, False, True, False, False]

有没有一种很好的方法来使用列表推导来仅将 True 元素添加到新列表中? 附加问题: 之后会弹出来自 a 的真实元素(因为它们现在已经被处理)

【问题讨论】:

  • zip 他们两个例如[v for v, state in zip(a, logical_state) if state]。如果它是一个 numpy 数组,你可以这样做 a[logical_states]

标签: python list boolean list-comprehension cluster-analysis


【解决方案1】:

你可以这样做:

>>> a =  [0.42, 0.18, 1.54, 2.9,  1.81, 2.35, 0.18, 1.54, 2.92]
>>> b = [False, True, False, False, False, False,  True, False, False]
>>> c = [num for num, truth_value in zip(a, b) if truth_value]
>>> c
[0.18, 0.18]

编辑: Q-c = [num for num, truth_value in zip(a, b) if truth_value] 这一行是做什么的? 上面的 A- 相当于下面的代码:

c = list()
for num, truth_value in zip(a, b):
    if truth_value:
        c.append(num)

Q- python 中的zip() 是什么? A-你可以阅读它here

如果还有人想了解更多解释,请从 cmets 告诉我。

【讨论】:

  • 工作得很好。关于我的附加问题:我猜想更新“a”以便现在只保留以前的“False”值需要和附加行“if not truth_value”条件对吗?
  • 是的,你是绝对正确的,只是不要忘记将它分配给“a”,请考虑通过单击我的答案上的勾号来接受我的答案,这样我就可以获得声誉,提前致谢.
【解决方案2】:

只是为了提供替代方案,这也可以使用itertools.compress(Python 3.1 或更高版本)来完成。 compress(a, b) 生成一个迭代器,它提供 a 的元素,b 中的对应元素的计算结果为 true。

例如:

>>> a =  [0.42, 0.18, 1.54, 2.9, 1.81, 2.35, 0.18, 1.54, 2.92]
>>> b = [False, True, False, False, False, False, True, False, False]
>>>
>>> c = list(itertools.compress(a, b))
>>> c
[0.18, 0.18]

仍然需要从 a 中删除这些元素,或者使用列表推导,或者使用相同的技术,但翻转布尔值,这有点不太优雅:

a = list(compress(a, (not x for x in b)))

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 2016-09-10
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多