测试Python中的数字是正数还是负数

时间:2014-03-31 19:19:18

标签: python

我正在比较数字列表并分配"分数"用于匹配方向。每场比赛的积极或消极都应该将参赛者的得分提高1。

例如:

list1 =[5.6, -7.1, 6.4]
list2 =[4.5, -2.0, -4.2]

应该给参与者2分,因为5.6和4.5都是正数(+1)和-7.1和-2.0都是负数(+1)。

我认为它可以用于比较积极因素:

def score2(list1, list2):
    count = 0
    for index in range (0, len(list1)):
        if list1[index] and list2[index] > 0:
            count += 1
        return count

但是负面部分仍然保持0,即使-7.1和-2.0都是负数。之前我把它作为前一个函数中的elif部分,但我把它分成了debug:

def score3(list1, list2):
    count = 0
    for index in range (0, len(list1)):
        if list1[index] and list2[index] < 0:
            count += 1
        return count

有趣的是,如果我这样做

print list1[1] and list2[1] < 0

它会打印True。所以我不确定score3中的错误。

4 个答案:

答案 0 :(得分:3)

list1[index] and list2[index] < 0表示list1[index] and (list2[index] < 0)and适用于list1[index]以及list2[index] < 0结果。请参阅the documentation以了解andor的工作原理。你想要的是:

list1[index] < 0 and list2[index] < 0

在您的第一个测试积极因素的示例中也是如此,但您并未注意到它,因为它恰好起作用。对于这种情况,你也应该这样做:

list1[index] > 0 and list2[index] > 0

答案 1 :(得分:3)

你可以很容易地得分:

result = sum(x*y > 0 for x, y in zip(list1, list2))

它是如何运作的?

zip()对元组中的相应元素进行配对:(5.6, 4.5), (-7.1, -2.0), (6.4, -4.2)

您可以使用生成器表达式迭代这些元组并将这两个数字相乘。如果两个数字均为负数或两个数字均为正数,则您的乘积将大于零。因此,如果两个数字具有相同的符号,则表达式x*y > 0将评估为True

True/Falsesum()个值的内容由内置True求和,其中1计为0,False为score3()。给你想要的分数。

PS。此解决方案比使用ifs更快。浮点乘法在现代硬件上约为4个周期,并且所有计算都是线性的,没有任何条件跳转,允许进行大量优化,如流水线。

修改

现在,你的and / or出了什么问题。

布尔运算符and懒惰地工作,返回第一个值,使表达式的结果为已知。在False的情况下,这是第一个评估为-7.1 and -2.0 < 0 的值(可以是空字符串,0,空列表,无等)或最后一个值,如果所有值都是真实的&#39} ;

所以在你的情况下,表达式被评估(对于索引1),如:

True

-7.1是非零值,因此它是True。必须进一步评估表达式。 -2.0也是(-7.1 and -2.0),因此-2.0评估为 -2.0 < 0 。现在,将此值与0进行比较:True,即{{1}}。

我希望能为你解决这个问题。 ;)

答案 2 :(得分:1)

您可以使用zip和sum与列表理解:

sum([1 for l1,l2 in zip(list1,list2) if ((l1>=0 and l2 >=0) or (l1<0 and l2 < 0)) ])

答案 3 :(得分:0)

此代码:

list1[1] and list2[1] < 0

测试list1[1]是否为非零且list2[1]是否小于零。

list1[1] > 0 and list2[1] > 0

测试list1[1]是否大于零且list2[1]是否大于零。