Schimbarea valorilor booleene dintr-o listă Python (Programare, Python)

smilingbuddha a intrebat.

Am o listă booleană în Python

mylist  = [True , True, False,...]

pe care vreau să o schimb în opusul logic [False, False, True , ...] Există o modalitate încorporată de a face acest lucru în Python (ceva de genul unui apel not(mylist) ) fără o buclă scrisă de mână pentru a inversa elementele?

8 răspunsuri
Levon

Este ușor cu înțelegerea listei:

mylist  = [True , True, False]

[not elem for elem in mylist]

randamente

[False, False, True]

Comentarii

  • Există o modalitate încorporată de a face acest lucru în Python (ceva de genul unui apel not(mylist) ) fără o buclă scrisă de mână pentru a inversa elementele? ……. for i in mylist Hmmm… –  > Por AMC.
  • @AMC, orice modificare a listei va fi o buclă sub acoperire, eu… suspectez OP pur și simplu nu a vrut un multi-line explicit for care să adauge fiecare element. O înțelegere a unei liste pe o singură linie este foarte foarte mult modul pythonic de a face acest lucru. –  > Por paxdiablo.
  • @paxdiablo O înțelegere a unei liste cu o singură linie este foarte mult modul pythonic de a face acest lucru. De acord. –  > Por AMC.
Steven Matz

Operatorul unar tilde (~) va face acest lucru pentru un numpy.ndarray. Așadar:

>>> import numpy
>>> mylist = [True, True, False]
>>> ~numpy.array(mylist)
array([False, False, True], dtype=bool)
>>> list(~numpy.array(mylist))
[False, False, True]

Rețineți că elementele din lista răsturnată vor fi de tip numpy.bool_ nu bool.

Comentarii

  • În timp ce numpy este un pachet drăguț, mă îngrijorează uneori răspunsurile care sugerează că este folosit în cazuri în care sarcina poate fi îndeplinită perfect în Python de bază. –  > Por paxdiablo.
  • @paxdiablo Este totuși util să știm că există și alte soluții. Dacă aveți nevoie să întoarceți mii de valori dintr-un np.array, ~array va fi mult mai rapid decât [not b for b in array]. –  > Por Guimoute.
  • @Guimoute Nu orice întrebare care implică o valoare de tip array trebuie să abordeze echivalentul Numpy. Acesta nu este un caz în care OP ar fi trebuit să folosească numpy în primul rând. –  > Por chepner.
John La Rooy
>>> import operator
>>> mylist  = [True , True, False]
>>> map(operator.not_, mylist)
[False, False, True]

Marcel Flygare

Numpy include această funcționalitate în mod explicit. Funcția „numpy.logical_not(x[, out])” calculează valoarea de adevăr a lui NOT x în funcție de element.

import numpy
numpy.logical_not(mylist)

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.logical_not.html (cu aceleași exemple)

Exemplu:

import numpy
mylist  = [True , True, False]
print (mylist)

returnează [True, True, False]

mylist=numpy.logical_not(mylist)
print (mylist)

returnează [False False True True]

Comentarii

  • Sunt singurul care nu înțelege un cuvânt din această explicație? –  > Por Wesley Smith.
  • Numpy o face pentru tine. Am adăugat un exemplu. –  > Por Marcel Flygare.
gebbissimo

numpy.invert este o altă opțiune frumoasă:

x = [False, True, True] 
not_x = np.invert(x) # [True, False, False]

mVChr

De ce nu folosiți o simplă înțelegere a listei?

mylist[:] = [not x for x in mylist]

Comentarii

  • Sunt doar curios, este necesar [:] în acest caz? –  > Por Levon.
  • @Levon, the [:] înseamnă mylist se referă în continuare la aceeași listă. Acest lucru poate fi de dorit dacă lista trebuie să fie mutată în interiorul unei funcții. –  > Por John La Rooy.
  • @gnibbler Dar înțelegerea listei creează o nouă listă, deci singura diferență este că, folosind [:], locația de memorie (id) a lui mylist nu s-ar schimba, în timp ce fără ea, s-ar schimba? –  > Por Levon.
  • @Levon este o diferență dacă aveți alte variabile care se referă la mylist – cu [:], , acestea vor fi afectate; fără ea, nu vor fi afectate. –  > Por lvc.
  • @GaryFixler un fel de – deși în Python, tinde să fie o idee proastă să încerci să gândești în termeni de pointeri și adrese de memorie. mylist[:] = ... este o atribuire de felie, ceea ce înseamnă că se termină prin a apela list.__setitem__ cu un slice obiect – care elimină toate elementele din mylist din acea felie (în acest caz, toate) și pune iterabilul RHS în acel loc. Diferența importantă față de modelul dvs. mental este că slice și RHS nu trebuie să aibă aceeași lungime: încercați a = list(range(10)); a[2:4] = range(5). –  > Por lvc.
Tyler Crompton

Eu aș face așa cum spun toți ceilalți, dar, pentru a documenta alternativele, ați putea face și așa ceva

import operator
myList = map(operator.not_, myList)

Gerben

ce ziceți de următoarele

>>> import numpy
>>> list(numpy.asarray(mylist)==False)

Tags: