Python:这段代码如何使用负整数0作为不同的索引值?

Python:这段代码如何使用负整数0作为不同的索引值?,python,indexing,Python,Indexing,我的算法采用列表[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设置为fals

我的算法采用列表
[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,等等。在我看来,最优雅的方法是使用减号将真值与索引相结合

编辑:
我找到了一个更好的方法来使用deques完成我想做的事情。我将保留这个问题,这样这里的答案就不会被浪费。

根据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)

这里是另一个可能的解决方案,不涉及使用float。 我们可以定义一个类,当我们试图获取它的符号时,它的功能是
-1
,当我们使用它作为数组的索引时,它的功能是
0
,使用


在C语言中,在二补机器(几乎任何现代平台)上,设置整数
0
的符号位不会得到-0,而是得到
2147483648
。您可以使用
-0.0
。如果您的列表是固定的,为什么不从
0
n
进行计数,同时执行正反两种情况呢?更一般地说,C与Python一样,不将
-0
作为整数,而可能将
-0
作为
浮点数(在IEEE浮动平台上,这也是几乎所有现代平台)。看起来您正在索引到一个单独的数组中,并从数组的两侧开始。您能描述一下您实际上在做什么吗?至于为什么没有
-0
,它几乎没有那么有用。当浮点计算从负方向下溢时,-0.0表示有用的信息。没有任何类似的下溢条件为int,并且为-0保留位模式会产生不好的结果。但是,即使浮点值为整数值,也不能实际为列表编制索引。@user2357112:所以强制它:
objects[int(d)]…
float可以用作字典的键,但是我们必须使用round()
round(d,10)来规范键空间
没有帮助。首先,
round
仍然返回一个浮点值,而不是整数。第二,为什么只舍入到10个十进制数字会使一些东西更像整数?@Navith:是的,但是
list[-1]
可能并没有达到OP的期望,它的行为取决于列表的长度。这个例子是人为的。你们中有人知道OP真正想做什么吗?我不知道。也许他们只需要
枚举(符号列表)
列表可以有任意顺序,例如
[-1,-0,1,0,2,-2]
@RenéG,我知道你找到了另一种方法,但是如果你好奇的话,有一种方法可以在类中实现这一点。让
\uuuuuu index\uuuu
\uu int\uuuuuuuuu>返回不同的值是有点误导的。如果你试图在任何其他上下文中使用这个值(比如将它乘以另一个数字)它的行为不像
-0
@abarnert,这是非常正确的,但op有一个非常具体的问题。当然,假设此列表中的值不会用于其他任何东西。
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))