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?
Este ușor cu înțelegerea listei:
mylist = [True , True, False]
[not elem for elem in mylist]
randamente
[False, False, True]
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.
- Î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ă. – > . - @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]
. – > . - @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. – > .
>>> import operator
>>> mylist = [True , True, False]
>>> map(operator.not_, mylist)
[False, False, True]
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]
- Sunt singurul care nu înțelege un cuvânt din această explicație? – > .
- Numpy o face pentru tine. Am adăugat un exemplu. – > .
numpy.invert este o altă opțiune frumoasă:
x = [False, True, True]
not_x = np.invert(x) # [True, False, False]
De ce nu folosiți o simplă înțelegere a listei?
mylist[:] = [not x for x in mylist]
- Sunt doar curios, este necesar [:] în acest caz? – > .
- @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. – > . - @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? – > . - @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. – > . - @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 apelalist.__setitem__
cu unslice
obiect – care elimină toate elementele dinmylist
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ția = list(range(10)); a[2:4] = range(5)
. – > .
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)
ce ziceți de următoarele
>>> import numpy
>>> list(numpy.asarray(mylist)==False)
for i in mylist
Hmmm… – > Por AMC.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.