我正在比较数字列表并分配"分数"用于匹配方向。每场比赛的积极或消极都应该将参赛者的得分提高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
中的错误。
答案 0 :(得分:3)
list1[index] and list2[index] < 0
表示list1[index] and (list2[index] < 0)
。 and
适用于list1[index]
以及list2[index] < 0
的结果。请参阅the documentation以了解and
和or
的工作原理。你想要的是:
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/False
个sum()
个值的内容由内置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]
是否大于零。