Pythonでのチルダ演算子の使用法は何ですか?
私が考えることができる1つのことは、文字列がパリンドロームであるかどうかをチェックするなど、文字列またはリストの両側で何かをすることです:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
他の良い使い方は?
これは、Cから借用される単項演算子(単一の引数を取る)であり、すべてのデータ型はバイトの解釈方法が異なるだけです。これは、「反転」または「補数」操作であり、入力データのすべてのビットが反転します。
Pythonでは、整数について、整数の 2の補数表現 のビットが反転され(個々のビットのb <- b XOR 1
のように)、結果は2の補数として再び解釈されます整数。したがって、整数の場合、~x
は(-x) - 1
と同等です。
~
演算子の具体化された形式は、operator.invert
として提供されます。独自のクラスでこの演算子をサポートするには、__invert__(self)
メソッドを指定します。
>>> import operator
>>> class Foo:
... def __invert__(self):
... print 'invert'
...
>>> x = Foo()
>>> operator.invert(x)
invert
>>> ~x
invert
同じクラスのインスタンスでもあるインスタンスの「補数」または「逆」を持つことが意味のあるクラスは、反転演算子の候補となります。ただし、演算子のオーバーロードは、誤用すると混乱を招く可能性があるため、クラスに__invert__
メソッドを提供する前に、それが本当に意味があることを確認してください。 (バイト文字列[ex:'\xff'
]は、バイト文字列のすべてのビットを反転する意味があるにもかかわらず、この演算子をサポートしないことに注意してください。)
~
は、本質的に-x - 1
を計算するpythonの- ビットごとの補数演算子 です。
テーブルは次のようになります
i ~i
0 -1
1 -2
2 -3
3 -4
4 -5
5 -6
i = 0
の場合はs[0]
とs[len(s) - 1]
を比較し、i = 1
の場合はs[1]
とs[len(s) - 2]
を比較します。
他の質問に関しては、これは bitwise hacks の範囲で役立ちます。
ビット単位の補演算子であることに加えて、~
はboolean値を元に戻すのにも役立ちますが、ここでは従来のbool
型ではなく、numpy.bool_
を使用する必要があります。
これについては、
import numpy as np
assert ~np.True_ == np.False_
論理値を逆にすると便利な場合があります。たとえば、以下の~
演算子を使用して、データセットをクレンジングし、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()]
配列のインデックス付けの場合、array[~i]
はreversed_array[i]
になることに注意してください。配列の末尾から始まるインデックス付けとして見ることができます:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
^ ^
i ~i
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]
上記のコードは「Hands On Machine Learning」からのものです
非整数インデックスマーカーとしてチルダ(〜記号)を使用している
あなたがマイナスを使うのと同じように-整数インデックス用です
例)配列[-1]