在列表Python中翻转布尔值

smi*_*dha 51 python

我在Python中有一个布尔列表

mylist  = [True , True, False,...]
Run Code Online (Sandbox Code Playgroud)

我想改变到逻辑的对立面[False, False, True , ...] 是否有一种内置的方式在Python中执行此操作(类似于调用not(mylist))而没有手写循环来反转元素?

Lev*_*von 62

列表理解很容易:

mylist  = [True , True, False]

[not i for i in mylist]
Run Code Online (Sandbox Code Playgroud)

产量

[False, False, True]
Run Code Online (Sandbox Code Playgroud)

  • _是否有一种内置方法可以在 Python 中执行此操作(类似于调用 not(mylist) ),而无需手写循环来反转元素?_ ....... `for i in mylist` 嗯... (3认同)
  • @AMC,*任何*列表修改都将是一个循环,我*怀疑*OP只是不想要一个附加每个元素的多行显式“for”循环。单行列表理解是非常 Pythonic 的方式来做到这一点。 (2认同)

小智 30

一元波浪号运算符(〜)将为numpy.ndarray执行此操作.所以:

>>> import numpy
>>> mylist = [True, True, False]
>>> ~numpy.array(mylist)
array([False, False, True], dtype=bool)
>>> list(~numpy.array(mylist))
[False, False, True]
Run Code Online (Sandbox Code Playgroud)

请注意,翻转列表的元素将是numpy.bool_而不是bool.

  • 虽然“numpy”是一个不错的包,但有时我只是担心答案表明它用于可以在基本 Python 中完美完成任务的情况。 (4认同)

Joh*_*ooy 11

>>> import operator
>>> mylist  = [True , True, False]
>>> map(operator.not_, mylist)
[False, False, True]
Run Code Online (Sandbox Code Playgroud)


geb*_*imo 9

numpy.invert 是另一个不错的选择:

x = [False, True, True] 
not_x = np.invert(x) # [True, False, False]
Run Code Online (Sandbox Code Playgroud)


Mar*_*are 8

Numpy明确包含此功能.函数"numpy.logical_not(x [,out])"计算NOT x元素的真值.

import numpy
numpy.logical_not(mylist)
Run Code Online (Sandbox Code Playgroud)

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.logical_not.html(同样的例子)

例:

import numpy
mylist  = [True , True, False]
print (mylist)
Run Code Online (Sandbox Code Playgroud)

返回[True,True,False]

mylist=numpy.logical_not(mylist)
print (mylist)
Run Code Online (Sandbox Code Playgroud)

返回[False False True]


mVC*_*Chr 6

为什么不使用简单的列表理解?

mylist[:] = [not x for x in mylist]
Run Code Online (Sandbox Code Playgroud)

  • @GaryFixler有点 - 虽然在Python中,尝试用指针和内存地址来思考往往是个坏主意.`mylist [:] = ...`是一个切片赋值,这意味着它最终用`slice`对象调用`list .__ setitem__` - 它删除了该切片中所有的`mylist`项(在这种情况下,所有这些),并将RHS迭代到那个位置.与心智模型的重要区别在于切片和RHS的长度不必相同:尝试`a = list(range(10)); a [2:4] =范围(5)`. (4认同)
  • @Levon如果你有其他变量引用`mylist` - 与`[:]`会有所不同,它们会受到影响; 没有它,他们不会. (3认同)
  • @Levon,`[:]`表示`mylist`仍然指的是同一个列表.如果列表应该在函数内变异,那么这可能是合乎需要的. (2认同)

Tyl*_*ton 6

我会像其他人说的那样做,但是为了记录替代方案,您也可以这样做

import operator
myList = map(operator.not_, myList)
Run Code Online (Sandbox Code Playgroud)