wake-up-neo.net

Der Tilde-Operator in Python

Wie benutzt man den Tilde-Operator in Python?

Eine Sache, über die ich nachdenken kann, ist, etwas auf beiden Seiten einer Zeichenfolge oder Liste zu tun, beispielsweise zu überprüfen, ob eine Zeichenfolge palindrom ist oder nicht:

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

Jeder andere gute Gebrauch?

146
clwen

Es ist ein unärer Operator (mit einem einzigen Argument), der von C entlehnt wird, wobei alle Datentypen nur unterschiedliche Arten der Interpretation von Bytes sind. Es ist die Operation "invertieren" oder "komplementieren", bei der alle Bits der Eingangsdaten umgekehrt sind.

In Python werden für Ganzzahlen die Bits der Zweierkomplementdarstellung der Ganzzahl umgekehrt (wie in b <- b XOR 1 für jedes einzelne Bit), und das Ergebnis wird erneut als Zweierkomplement-Ganzzahl interpretiert. Für Ganzzahlen ist ~x äquivalent zu (-x) - 1.

Die verifizierte Form des ~-Operators wird als operator.invert bereitgestellt. Um diesen Operator in Ihrer eigenen Klasse zu unterstützen, weisen Sie ihm eine __invert__(self)-Methode zu.

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

Jede Klasse, in der es sinnvoll ist, ein "Komplement" oder "Invers" einer Instanz zu haben, die auch eine Instanz derselben Klasse ist, ist ein möglicher Kandidat für den invert-Operator. Das Überladen von Operatoren kann jedoch bei Missbrauch zu Verwirrung führen. Stellen Sie daher sicher, dass dies wirklich sinnvoll ist, bevor Sie Ihrer Klasse eine __invert__-Methode bereitstellen. (Beachten Sie, dass Byte-Strings [ex: '\xff'] diesen Operator nicht unterstützen, obwohl es sinnvoll ist, alle Bits eines Byte-Strings zu invertieren.)

139
wberry

~ ist der bitweise Komplementoperator in Python, der im Wesentlichen -x - 1 berechnet.

So würde ein Tisch aussehen

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

Für i = 0 würde es also s[0] mit s[len(s) - 1], für i = 1, s[1] mit s[len(s) - 2] vergleichen.

Was Ihre andere Frage betrifft, kann dies für eine Reihe von bitweisen Hacks nützlich sein.

69
GWW

~ kann nicht nur ein bitweiser Komplementoperator sein, er kann auch dazu beitragen, einen boolean - Wert umzukehren, obwohl es hier nicht der übliche bool-Typ ist, sondern numpy.bool_.


Dies wird erklärt in

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

Das Umkehren des logischen Werts kann manchmal nützlich sein, z. B. wird der folgende Operator ~ verwendet, um Ihre Datenmenge zu bereinigen und eine Spalte ohne NaN zurückzugeben.

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

Es sollte beachtet werden, dass array[~i] bei Array-Indizierung reversed_array[i] beträgt. Es kann als Indizierung ab dem Ende des Arrays angesehen werden:

[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]

der obige Code stammt von "Hands On Machine Learning"

sie verwenden Tilde (~ Zeichen) als nicht ganzzahlige Indexmarkierung

genau wie Sie minus verwenden - ist für den ganzzahligen Index

ex) Array [-1]

0
hyukkyulee