我有2个输入列表,例如以下小示例,并希望对其进行总结:
小例子:
a = [4, 5, 2]
b = [3, 5, 4]
我想逐项比较这两个列表,并基于这些
比较会给每个列表打分。如果它们相等,则两个列表
将会得到0分,并且一个列表中的项目更大,该列表将
得到1分。最后,结果将是一个列表(名为RES
)
有2个项目。第一项是a和的所有结果的总和
的第二项是b的所有结果的总和。
在此示例中,我比较了a和b的项目1,由于4> 3,所以a
得分为1。通过比较其他2个项目,两个列表的得分均为0
第二项和b将为第三项获得1。全部加起来
所有比较的分数,a将获得1 (1+0+0)
,b将获得1
也(0+0+1)
。
这是小示例的预期输出:
RES = [1, 1]
要获得此结果,我在python中编写了以下代码:
def fun(a, b):
for i in range(len(a)):
if a[i] > b[i]:
AL = 1
elif a[i] == b[i]:
AL = BL = 0
elif a[i] < b[i]:
BL = 1
RES = list(AL, BL)
return RES
但是它不返回我想要的。你知道如何解决吗?
答案 0 :(得分:1)
代码中的某些问题
RES = [AL,BL]
不是您定义具有两个元素的列表的方法,而您想做AL
BL
和AL
,而是将其重置为新值BL
和a = [4, 5, 2]
b = [3, 5, 4]
def fun(a, b):
#Initialize AL and BL
AL = 0
BL = 0
#Increment AL and BL according to the conditions
for i in range(len(a)):
if a[i] > b[i]:
AL += 1
elif a[i] < b[i]:
BL += 1
#Make a list and return it
return [AL, BL]
print(fun(a,b))
所以更新代码可能看起来像
a = [4, 5, 2]
b = [3, 5, 4]
def fun(a, b):
#Initialize AL and BL
AL = 0
BL = 0
#Increment AL and BL according to the conditions, and iterate on them via zip
for a,b in zip(a,b):
if a > b:
AL += 1
elif a< b:
BL += 1
#Make a list and return it
return [AL, BL]
print(fun(a,b))
作为一项额外的优化,您可以使用zip来并行遍历两个列表
[1, 1]
两种情况下的输出都相同
cpr
include
cpr
other code stuff
the code I'm working on
答案 1 :(得分:1)
您的代码存在以下问题:
AL和BL变量未初始化。
您将在每次迭代中覆盖AL和BL的值。尝试将AL
和BL
增加AL += 1
列表类在构造函数中采用最多单个参数。 RES = list(AL, BL)
无效。尝试RES = [AL, BL]
。
两个挑剔的细节-使用range(len(ITERABLE))构造对iterable进行迭代不是很好的做法。如果需要索引,请使用枚举。这样,您无需创建新的范围对象。因此,请使用for i in range(len(ITERABLE)):
而不是for i, elem in enumerate(ITERABLE):
。另外,常量通常使用大写的变量名。
正确的实现是:
def fun(a, b):
a_is_greater = 0
b_is_greater = 0
for element_a, element_b in zip(a, b):
if element_a > element_b:
a_is_greater += 1
elif element_a < element_b:
b_is_greater += 1
return [a_is_greater, b_is_greater]
编辑:简短的解决方案是:
def fun(a,b):
return [sum(col) for col in zip(*[(al > bl, al < bl) for al, bl in zip(a, b)])]
答案 2 :(得分:0)
使用变量来跟踪两个列表的得分。
def fun(a, b):
score_a = score_b = 0
for a_i, b_i in zip(a, b):
if a_i > b_i:
score_a += 1
...
return [score_a, score_b]
请注意,我在这里使用zip
,以便我们可以成对读取a
和b
中的每个元素。
答案 3 :(得分:0)
您的代码有两件事。
首先,这不是list
的工作方式。它接受一个可迭代的一个参数,并将其转换为list
。您需要[AL, BL]
。
第二个原因是您不断覆盖AL
和BL
的值,因此您实际上从未获得任何帮助。
我想你想要这个:
def fun(a, b):
AL = 0
BL = 0
for i in range(len(a)):
a_value = a[i]
b_value = b[i]
if a_value > b_value:
AL += 1
elif a_value < b_value:
BL += 1
return [AL, BL]
print(fun([4, 5, 2], [3, 5, 4]))
输出:
[1, 1]
也就是说,当您想要的是list
中的实际元素时,直接在list
上进行迭代更像Python一样。您还可以使用list
理解,例如:
import numpy as np
def fun(a, b):
diff = [np.sign(a_value - b_value) for a_value, b_value in zip(a, b)]
return [diff.count(1), diff.count(-1)]
print(fun([4, 5, 2], [3, 5, 4]))
这利用了以下事实:如果您计算a - b
,则如果a > b
的结果为正,如果a < b
的结果为负,如果相等则为0。然后,我们可以使用每个元素的符号来分别计算正负元素的数量。
答案 4 :(得分:0)
const body = new URLSearchParams({id: "12345678"});
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
})
};
return this.http.post(url, body.toString(), httpOptions).pipe(mergeMap( (response:any) => {
console.log('response ', response);
return of (response);
}));
输出: [1,1]