파이썬에서 물결표 연산자의 사용법은 무엇입니까?
내가 생각할 수있는 한 가지는 문자열이 회 문형인지 아닌지 확인하는 것과 같이 문자열이나 목록의 양쪽에서 무언가를하는 것입니다.
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]
.
다른 질문에 관해서는, 이것은 다양한 비트 해킹에 유용 할 수 있습니다 .
답변
비트 보수 연산자 외에도 부울 값을 ~
되 돌리는 데 도움이 될 수 있지만 여기에서는 일반적인 유형 이 아니지만 을 사용해야합니다 .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
답변
내가 실제로 이것을 사용한 유일한 시간은입니다 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])