Python中代字号运算符的用法是什么?
我能想到的一件事是在字符串或列表的两边做一些事情,比如检查字符串是否是回文:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
还有其他好的用法吗?
答案 0 :(得分:152)
它是从C借用的一元运算符(采用单个参数),其中所有数据类型只是解释字节的不同方式。它是“反转”或“补码”操作,其中输入数据的所有位都被反转。
在Python中,对于整数,整数的twos-complement representation的位被反转(如b <- b XOR 1
中的每个位),结果再次解释为二进制补码整数。因此,对于整数,~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'
]不支持此运算符,即使反转字节字符串的所有位也是有意义的。)
答案 1 :(得分:73)
~
是python中的bitwise complement operator,主要计算-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]
进行比较。
至于您的其他问题,这对于bitwise hacks范围内有用。
答案 2 :(得分:21)
除了作为按位补码运算符之外,~
还可以帮助恢复布尔值,虽然它不是传统的bool
类型,而是应该使用{{ 1}}。
这在
中有解释numpy.bool_
反转逻辑值有时很有用,例如,import numpy as np
assert ~np.True_ == np.False_
下方运算符用于清理数据集并返回没有NaN的列。
~
答案 3 :(得分:7)
在实践中,我唯一一次使用过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
答案 4 :(得分:4)
请注意,在数组索引的情况下,array[~i]
等于reversed_array[i]
。可以将其视为从数组末尾开始的索引:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
^ ^
i ~i
答案 5 :(得分:0)
我正在解决这个leetcode problem,我遇到了一个叫beautiful solution的用户Zitao Wang。
问题是这样的:对于给定数组中的每个元素,在不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