Python中的波形符运算符

时间:2011-11-29 02:43:57

标签: python operators

Python中代字号运算符的用法是什么?

我能想到的一件事是在字符串或列表的两边做一些事情,比如检查字符串是否是回文:

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

还有其他好的用法吗?

6 个答案:

答案 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 = 1s[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