[python] 파이썬의 물결표 연산자

파이썬에서 물결표 연산자의 사용법은 무엇입니까?

내가 생각할 수있는 한 가지는 문자열이 회 문형인지 아닌지 확인하는 것과 같이 문자열이나 목록의 양쪽에서 무언가를하는 것입니다.

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

다른 좋은 사용법?



답변

C에서 빌려온 단항 연산자 (단일 인수 사용)는 모든 데이터 유형이 바이트를 해석하는 다른 방식 일뿐입니다. 입력 데이터의 모든 비트가 반전되는 “반전”또는 “보완”연산입니다.

파이썬에서 정수의 경우 정수의 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

그래서 테이블은

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

다른 질문에 관해서는, 이것은 다양한 비트 해킹에 유용 할 수 있습니다 .


답변

비트 보수 연산자 외에도 부울 값을 ~되 돌리는 데 도움이 될 수 있지만 여기에서는 일반적인 유형 이 아니지만 을 사용해야합니다 .boolnumpy.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


답변

내가 실제로 이것을 사용한 유일한 시간은입니다 numpy/pandas. 예를 들어, .isin() dataframe method를 사용하십시오 .

문서에서 그들은이 기본 예제를 보여줍니다

>>> df.isin([0, 2])
        num_legs  num_wings
falcon      True       True
dog        False       True

그러나 대신 [0, 2]에 없는 모든 행을 원한다면 어떻게해야 합니까?

>>> ~df.isin([0, 2])
        num_legs  num_wings
falcon     False       False
dog        True        False


답변

나는이 leetcode 문제를 해결하고 있었고 Zitao Wang 이라는 사용자 가이 아름다운 솔루션 을 발견했습니다 .

문제는 divison과에서 사용하지 않고 남아있는 모든 숫자의 제품을 찾을 수 지정된 배열의 각 요소에 대해 이렇게되면 O(n)시간을

표준 솔루션은 다음과 같습니다.

Pass 1: For all elements compute product of all the elements to the left of it
Pass 2: For all elements compute product of all the elements to the right of it
        and then multiplying them for the final answer 

그의 솔루션은 사용하여 하나의 for 루프 만 사용합니다. 그는 왼쪽 제품과 오른쪽 제품을 사용하여 즉석에서 계산합니다.~

def productExceptSelf(self, nums):
    res = [1]*len(nums)
    lprod = 1
    rprod = 1
    for i in range(len(nums)):
        res[i] *= lprod
        lprod *= nums[i]
        res[~i] *= rprod
        rprod *= nums[~i]
    return res


답변

이것은 사소한 사용법은 물결표입니다 …

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”의 코드입니다.

-부호 인덱스 마커 대신 틸드 (~ 기호)를 사용합니다.

마이너스를 사용하는 것처럼-정수 인덱스입니다

전의)

array = [1,2,3,4,5,6]
print(array[-1])

와 같은

print(array[~1])