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?

124
demandé sur clwen 2011-11-29 06:43:56

4 réponses

C'est un opérateur unaire (prenant un seul argument) emprunté à C, où tous les types de données ne sont que des manières différentes d'interpréter les octets. C'est l'opération "inverser" ou "compléter", 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 à deux compléments {[13] } de l'entier sont inversés (comme dans b <- b XOR 1 pour chaque bit individuel), et le résultat est interprété à nouveau comme un entier à deux compléments. 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 la classe dans laquelle il est pertinent d'avoir un "complément" ou "inverse" d'une instance qui est aussi une instance de la même classe est un candidat possible pour l'inversion de l'opérateur. Cependant, la surcharge de l'opérateur peut entraîner une confusion si elle est mal utilisée, alors assurez-vous qu'il est vraiment logique de le faire avant fournir une méthode __invert__ à votre classe. (Notez que byte-strings [ex: '\xff'] ne supporte pas cet opérateur, même s'il est significatif d'inverser tous les bits d'une chaîne d'octets.)

125
répondu wberry 2012-04-23 22:55:17

~ est l'opérateur de complément bit à bit 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 serait comparer s[0] avec s[len(s) - 1], pour i = 1, s[1] avec s[len(s) - 2].

Quant à votre autre question, cela peut être utile pour une plage de hacks au niveau du BIT .

59
répondu GWW 2017-08-18 02:14:00

En plus d'être un opérateur de complément binaire, ~ peut également aider à rétablir une valeur booléenne, 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, ci-dessous ~ 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()]
18
répondu Nicholas 2016-09-04 06:33:15
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 tilde (~signe) comme marqueur d'index non entier

Tout comme vous utilisez moins - est pour l'index entier

EX) tableau [-1]

0
répondu hyukkyulee 2018-09-13 18:40:50