web-dev-qa-db-fra.com

L'opérateur tilde en Python

Quelle est l'utilisation de l'opérateur tilde en Python?

Une chose à laquelle je peux penser est de faire quelque chose des deux côtés d'une chaîne ou d'une liste, comme vérifier si une chaîne est palindromique ou non:

def is_palindromic(s):
    return all(s[i] == s[~i] for i in range(len(s) / 2)) 

Tout autre bon usage?

146
clwen

Il s’agit d’un opérateur unaire (prenant un seul argument) emprunté à C, où tous les types de données ne sont que des façons différentes d’interpréter les octets. Il s'agit de l'opération "invertir" ou "complémentaire" dans laquelle tous les bits des données d'entrée sont inversés.

En Python, pour les entiers, les bits de la représentation du complément twos-complément de l'entier sont inversés (comme dans b <- b XOR 1 pour chaque bit individuel), et le résultat est à nouveau interprété comme un entier à deux complément. Donc, pour les entiers, ~x est équivalent à (-x) - 1.

La forme réifiée de l'opérateur ~ est fournie sous la forme operator.invert. Pour prendre en charge cet opérateur dans votre propre classe, donnez-lui une méthode __invert__(self).

>>> import operator
>>> class Foo:
...   def __invert__(self):
...     print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert

Toute classe dans laquelle il est utile de disposer d'un "complément" ou d'un "inverse" d'une instance qui est également une instance de la même classe est un candidat possible pour l'opérateur d'inversion. Cependant, une surcharge de l'opérateur peut entraîner une confusion si elle est mal utilisée. Assurez-vous qu'il est donc logique de le faire avant de fournir une méthode __invert__ à votre classe. (Notez que les chaînes d'octets [ex: '\xff'] ne prennent pas en charge cet opérateur, même s'il est judicieux d'inverser tous les bits d'une chaîne d'octets.)

139
wberry

~ est l'opérateur de complément binaire en python qui calcule essentiellement -x - 1

Donc, une table ressemblerait

i  ~i  
0  -1
1  -2
2  -3
3  -4 
4  -5 
5  -6

Donc, pour i = 0, il comparerait s[0] avec s[len(s) - 1], pour i = 1, s[1] avec s[len(s) - 2].

En ce qui concerne votre autre question, cela peut être utile pour une gamme de hacks au niveau des bits .

69
GWW

En plus d'être un opérateur complémentaire au niveau du bit, ~ peut également aider à rétablir une valeur boolean , bien que ce ne soit pas le type bool conventionnel ici, vous devriez plutôt utiliser numpy.bool_.


Ceci est expliqué dans,

import numpy as np
assert ~np.True_ == np.False_

Inverser la valeur logique peut parfois être utile, par exemple si l'opérateur ~ est utilisé pour nettoyer votre jeu de données et vous renvoyer une colonne sans NaN.

from numpy import NaN
import pandas as pd

matrix = pd.DataFrame([1,2,3,4,NaN], columns=['Number'], dtype='float64')
# Remove NaN in column 'Number'
matrix['Number'][~matrix['Number'].isnull()]
20
Nicholas

Il est à noter que dans le cas de l'indexation de tableaux, array[~i] équivaut à reversed_array[i]. Cela peut être vu comme une indexation commençant à la fin du tableau:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
    ^                 ^
    i                ~i
2
Le Frite
def split_train_test_by_id(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio)) 
    return data.loc[~in_test_set], data.loc[in_test_set]

le code ci-dessus provient de "Hands On Machine Learning"

vous utilisez un tilde (signe ~) comme marqueur d'index non entier

tout comme vous utilisez moins - est pour l'indice entier

ex) tableau [-1]

0
hyukkyulee