将2个列表汇总为另一个列表

时间:2019-06-03 07:40:04

标签: python python-3.x

我有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

但是它不返回我想要的。你知道如何解决吗?

5 个答案:

答案 0 :(得分:1)

代码中的某些问题

  • RES = [AL,BL]不是您定义具有两个元素的列表的方法,而您想做AL
  • 您不会为每次迭代更新BLAL,而是将其重置为新值
  • 您需要在循环之前初始化BLa = [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)

您的代码存在以下问题:

  1. AL和BL变量未初始化。

  2. 您将在每次迭代中覆盖AL和BL的值。尝试将ALBL增加AL += 1

  3. 列表类在构造函数中采用最多单个参数。 RES = list(AL, BL)无效。尝试RES = [AL, BL]

  4. 两个挑剔的细节-使用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,以便我们可以成对读取ab中的每个元素。

答案 3 :(得分:0)

您的代码有两件事。

首先,这不是list的工作方式。它接受一个可迭代的一个参数,并将其转换为list。您需要[AL, BL]

第二个原因是您不断覆盖ALBL的值,因此您实际上从未获得任何帮助。

我想你想要这个:

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]