web-dev-qa-db-ja.com

Pythonのチルダ演算子

Pythonでのチルダ演算子の使用法は何ですか?

私が考えることができる1つのことは、文字列がパリンドロームであるかどうかをチェックするなど、文字列またはリストの両側で何かをすることです:

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

他の良い使い方は?

167
clwen

これは、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']は、バイト文字列のすべてのビットを反転する意味があるにもかかわらず、この演算子をサポートしないことに注意してください。)

160
wberry

~は、本質的に-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 の範囲で役立ちます。

73
GWW

ビット単位の補演算子であることに加えて、~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()]
21
Nicholas

配列のインデックス付けの場合、array[~i]reversed_array[i]になることに注意してください。配列の末尾から始まるインデックス付けとして見ることができます:

[0, 1, 2, 3, 4, 5, 6, 7, 8]
    ^                 ^
    i                ~i
7
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]

上記のコードは「Hands On Machine Learning」からのものです

非整数インデックスマーカーとしてチルダ(〜記号)を使用している

あなたがマイナスを使うのと同じように-整数インデックス用です

例)配列[-1]

0
hyukkyulee