在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的错误,因为它涉及除以零。
答案 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]
修正:现在它也适用于负数。