Python:此代码如何使用负整数 0 作为不同的索引值?
Python: how can this code use negative integer 0 as a distinct index value?
我的算法采用列表 [0,-0,1,-1,2,-2,3,-3]
等,并在伪代码中执行以下操作:
while list:
d = list.pop()
objects[abs(d)] *= sign(d)
从这里可以看出为什么需要 -0
。如果我将符号单独存储或从 1 或其他内容进行索引,我的代码将不得不变得不那么优雅。如何让 python 存储 0
和 -0
?
编辑:
基本上我正在实施回溯搜索。因此,该列表中的变量以任意顺序排列,减号表示设置为 false。它遍历并将 0 设置为 true,然后将 0 设置为 false,然后将 1 设置为 true,然后将 -1 设置为 false,等等。在我看来,最优雅的方法是通过使用将真值与索引结合起来减号。
编辑:
我找到了一种更好的方法来使用双端队列来完成我想做的事情。我会留下这个问题,以免浪费这里的答案。
按照 Blender 的建议使用浮点数和函数 copysign
:
import math
list=[0.0,-0.0,1.0,-1.0,2.0,-2.0,3.0,-3.0]
objects={}
while list:
d = round(list.pop(),10)
if d not in objects:
objects[d]=1.0
objects[d] *= math.copysign(1.0,d)
这是另一种可能的解决方案,不涉及使用浮点数。
我们可以定义一个 class ,当我们尝试获取它的符号时,它的功能是 -1
;当我们将它用作数组的索引时,它的功能是 0
,使用 [=13 的魔术方法=].
class NegativeZero:
def __index__(self):
return 0
def __int__(self):
return -1
def __abs__(self):
return 0
N = NegativeZero()
myList = [0,N,1,-1,2,-2,3,-3]
while myList:
d = myList.pop()
objects[abs(d)] *= sign(int(d))
我的算法采用列表 [0,-0,1,-1,2,-2,3,-3]
等,并在伪代码中执行以下操作:
while list:
d = list.pop()
objects[abs(d)] *= sign(d)
从这里可以看出为什么需要 -0
。如果我将符号单独存储或从 1 或其他内容进行索引,我的代码将不得不变得不那么优雅。如何让 python 存储 0
和 -0
?
编辑: 基本上我正在实施回溯搜索。因此,该列表中的变量以任意顺序排列,减号表示设置为 false。它遍历并将 0 设置为 true,然后将 0 设置为 false,然后将 1 设置为 true,然后将 -1 设置为 false,等等。在我看来,最优雅的方法是通过使用将真值与索引结合起来减号。
编辑: 我找到了一种更好的方法来使用双端队列来完成我想做的事情。我会留下这个问题,以免浪费这里的答案。
按照 Blender 的建议使用浮点数和函数 copysign
:
import math
list=[0.0,-0.0,1.0,-1.0,2.0,-2.0,3.0,-3.0]
objects={}
while list:
d = round(list.pop(),10)
if d not in objects:
objects[d]=1.0
objects[d] *= math.copysign(1.0,d)
这是另一种可能的解决方案,不涉及使用浮点数。
我们可以定义一个 class ,当我们尝试获取它的符号时,它的功能是 -1
;当我们将它用作数组的索引时,它的功能是 0
,使用 [=13 的魔术方法=].
class NegativeZero:
def __index__(self):
return 0
def __int__(self):
return -1
def __abs__(self):
return 0
N = NegativeZero()
myList = [0,N,1,-1,2,-2,3,-3]
while myList:
d = myList.pop()
objects[abs(d)] *= sign(int(d))