如何在 Python 中切换布尔数组?
Posted
技术标签:
【中文标题】如何在 Python 中切换布尔数组?【英文标题】:How do I toggle a boolean array in Python? 【发布时间】:2013-11-23 15:20:24 【问题描述】:假设我有以下数组:
[True, True, True, True]
如何切换此数组中每个元素的状态?
切换会给我:
[False, False, False, False]
同样,如果我有:
[True, False, False, True]
切换会给我:
[False, True, True, False]
我知道在 Python 中切换布尔值最直接的方法是使用“not”,我在 stackexchange 上找到了一些示例,但如果它在数组中,我不确定如何处理它。
【问题讨论】:
【参考方案1】:使用not
仍然是最好的方法。你只需要一个list comprehension 就可以了:
>>> x = [True, True, True, True]
>>> [not y for y in x]
[False, False, False, False]
>>> x = [False, True, True, False]
>>> [not y for y in x]
[True, False, False, True]
>>>
我很确定我的第一个解决方案就是您想要的。但是,如果你想改变原始数组,你可以这样做:
>>> x = [True, True, True, True]
>>> x[:] = [not y for y in x]
>>> x
[False, False, False, False]
>>>
【讨论】:
完美!非常感谢。 @user2957365:请注意,这不会切换原始列表。它返回一个新列表。 @StevenRumbalski - 我很确定 OP 只是把他的帖子写错了,实际上想要我的第一个解决方案。但是,如果他没有,我添加了另一个。 @iCodez:这不是批评,只是仅供参考。如果他想更改原始列表,则分配给切片是要走的路:x[:] = [not y for y in x]
。如果他想影响一个本地名称,那么简单的分配就是要走的路:x = [not y for y in x]
。【参考方案2】:
在纯 python 中,带有列表理解
>>> x = [True, False, False, True]
>>> [not b for b in x]
[False, True, True, False]
或者,您可以考虑使用 numpy 数组来实现此功能:
>>> x = np.array(x)
>>> ~x
array([False, True, True, False], dtype=bool)
【讨论】:
【参考方案3】:@iCodez 对列表理解的回答更符合 Python 风格。我将添加另一种方法:
>>> a = [True, True, True, True]
>>> print map(lambda x: not x, a)
[False, False, False, False]
【讨论】:
-0。我是map
的粉丝,但不是map
的粉丝。没有 lambda 的列表理解可以更好地处理。
同意,与使用 lambda 的 map 相比,python 的列表理解要 beautiful 和 pythonic 得多。我只是把它作为另一种方式。以上是关于如何在 Python 中切换布尔数组?的主要内容,如果未能解决你的问题,请参考以下文章