如何在Python中减少任何不等于0到1的数字以及任何等于0的数字保持为0?

时间:2016-01-20 19:09:00

标签: python

在Python中,我想要使任何大于0的数字减少到1,任何小于0的数字都将变为-1,如果数字等于0,它将保持为0如果没有任何if语句我怎么能这样做呢?我试着将数字自己分开,这将为正数返回1,为负数返回-1,但显然是0的错误。是否有另一种解决方案?我只是在寻找一个简单,简洁的内置或可导入功能。

另外,还有一个问题:如何将任何不等于0的数字更改为1,任何等于0的数字在没有if语句的情况下仍为0?

编辑(解决问题,因为我受到质疑):

以下是我最初为第一个问题尝试过的代码:

from Chat chat in _skype.chats select new Chat

然而,这会返回0的错误,因为它涉及除以零。

5 个答案:

答案 0 :(得分:0)

为什么你如此迫切地想要避免if语句?拥抱他们!

def reducer(numbers):
    for n in numbers:
        if n > 0:
            n = 1
        elif n < 0:
            n = -1

答案 1 :(得分:0)

任何非零数字,例如x,可以分别映射到-1 / 1为负数/正数,为x/|x|

arr = [-15, -0.6, 3, 0, 27, -16]
arrFixed = list(map(lambda x : 0 if x==0 else x/abs(x), arr))
print(arrFixed)
# [-1.0, -1.0, 1.0, 0, 1.0, -1.0]

答案 2 :(得分:0)

您可以使用math.copysign(x,y)。但是,它将0映射到+1,因此您需要更多想象力,例如

for x in [-10,0,4]: 
    print(math.copysign(0.5,x)-math.copysign(0.5,-x))

-1.0
0.0
1.0

答案 3 :(得分:0)

您列出的第一个行为在数学上称为signum操作。如果你被允许使用numpy,我只是这样做:

import numpy
sign = numpy.sign(x)

关于你的第二个问题,这很容易。

只需使用:

int(bool(x))

编辑:

通过一些修修补补,我找到了第一个问题的解决方案:

negsign = int(int(num) >> 31)
possign = int(num > 0)

sign = negsign + possign

请注意,我没有对-0等特殊情况进行全面测试。

答案 4 :(得分:0)

[(lambda x: x if x == 0 else x // abs(x))(x) for x in arr]

修正:现在它也适用于负数。