¿Cuál es el uso del operador tilde en Python?
Una cosa en la que puedo pensar es hacer algo en ambos lados de una cadena o lista, como verificar si una cadena es palindrómica o no:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
¿Algún otro buen uso?
~
implementado por el método especial__invert__
no está relacionado con elnot
operador, que lógicamente niega el valor devuelto por__bool__
(o__nonzero__
en 2.x). Tampoco está relacionado con el-
operador de negación unario, implementado por__neg__
. Por ejemplo~True == -2
, que no esFalse
o falso, y-False == 0
que sigue siendo falso.-False==0
) Es confuso, ya que estabas hablando sobre el~
, y~False == -1
que no es falso.__neg__
). Probablemente debería haber seguido usandoTrue
, por ejemplo-True == -1
, que no es -2 oFalse
falso, lo que lo vincula más claramente con el~True
resultado y también que la negación aritmética de abool
es diferente de su negación lógica. No estaba tratando de ser profundo. Solo estaba destacando 3 operaciones y los métodos especiales subyacentes que a veces se confunden.Respuestas:
Es un operador unario (tomando un solo argumento) que se toma prestado de C, donde todos los tipos de datos son simplemente diferentes formas de interpretar los bytes. Es la operación de "inversión" o "complemento", en la que todos los bits de los datos de entrada se invierten.
En Python, para los enteros, los bits de la representación de dos complementos del entero se invierten (como en
b <- b XOR 1
cada bit individual), y el resultado se interpreta nuevamente como un entero de dos complementos. Entonces, para enteros,~x
es equivalente a(-x) - 1
.La forma reificada del
~
operador se proporciona comooperator.invert
. Para admitir este operador en su propia clase, dele un__invert__(self)
método.Cualquier clase en la que sea significativo tener un "complemento" o "inverso" de una instancia que también sea una instancia de la misma clase es un posible candidato para el operador invertido. Sin embargo, la sobrecarga del operador puede generar confusión si se usa incorrectamente, así que asegúrese de que realmente tenga sentido hacerlo antes de proporcionar un
__invert__
método a su clase. (Tenga en cuenta que las cadenas de bytes [ej .:'\xff'
] no son compatibles con este operador, aunque sea significativo invertir todos los bits de una cadena de bytes).fuente
~
es el operador de complemento bit a bit en Python que esencialmente calcula-x - 1
Así se vería una mesa
Entonces, para
i = 0
compararlos[0]
cons[len(s) - 1]
, parai = 1
,s[1]
cons[len(s) - 2]
.En cuanto a su otra pregunta, esto puede ser útil para una variedad de hacks bit a bit .
fuente
Además de ser un operador de complemento a nivel de bits,
~
también puede ayudar a revertir un valor booleano , aunque no es elbool
tipo convencional aquí, más bien debería usarlonumpy.bool_
.Esto se explica en,
Revertir el valor lógico puede ser útil a veces, por ejemplo, el siguiente
~
operador se utiliza para limpiar su conjunto de datos y devolverle una columna sin NaN.fuente
numpy.NaN
parece definirse comonumpy.float
. Si lo intento~numpy.NaN
, Python se queja, que el operador unario~
no está definido para el tiponumpy.float
.~True
resulta-2
, mientras que para booleanos numpy~np.True_
resultaFalse
.Cabe señalar que en el caso de la indexación de matrices,
array[~i]
equivale areversed_array[i]
. Se puede ver como indexación a partir del final de la matriz:fuente
~i
(es decir, el valor negativo) actúa como un punto de partida para el índice de matriz que Python acepta felizmente, lo que hace que el índice se enrolle y elija desde la parte posterior.La única vez que he usado esto en la práctica es con
numpy/pandas
. Por ejemplo, con el.isin()
método del marco de datos .En los documentos muestran este ejemplo básico
Pero, ¿y si en lugar de eso quisieras que todas las filas no estuvieran en [0, 2]?
fuente
Estaba resolviendo este problema de leetcode y encontré esta hermosa solución de un usuario llamado Zitao Wang .
El problema es el siguiente: para cada elemento de la matriz dada, encuentre el producto de todos los números restantes sin utilizar la división y a
O(n)
tiempoLa solución estándar es:
Su solución usa solo uno para bucle haciendo uso de. Calcula el producto izquierdo y el producto derecho sobre la marcha usando
~
fuente
Este es un uso menor es tilde ...
el código anterior es de "Hands On Machine Learning"
utiliza tilde (signo ~) como alternativa a - marcador de índice de signo
al igual que usa menos - es para el índice entero
ex)
es lo mismo que
print(array[~1])
fuente