代码之家  ›  专栏  ›  技术社区  ›  Bjørn Kjos-Hanssen

多个列表的总和

  •  2
  • Bjørn Kjos-Hanssen  · 技术社区  · 7 年前

    如何简化作业 x (可能使用某种循环)在下面?

    a = [(0,0,0), (0,1,1), (1,0,1), (1,1,0)]
    b = [0, 2, 1, 1, 2, 2]
    x = a[b[0]] + a[b[1]] + a[b[2]] + a[b[3]] + a[b[4]] + a[b[5]]
    
    6 回复  |  直到 7 年前
        1
  •  2
  •   U13-Forward    7 年前

    试试这个,需要第二个理由吗 sum :

    print(sum(map(lambda x: a[x],b),()))
    

    (0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1)
    

    或发电机:

    print(sum((a[x] for x in b),()))
    

    同时输出:

    (0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1)
    
        2
  •  2
  •   Batman    7 年前

    您通常会/可能会使用此表达式来执行以下操作:

    sum(a[x] for x in b)
    

    a 如果你尝试这个,你会得到一个错误。你需要列一个元组列表,然后使用 chain

    from itertools import chain
    
    foo = [a[x] for x in b]
    x = chain(*foo)
    

    或:

    x = tuple(chain(*a[x] for x in b))
    
        3
  •  1
  •   N Chauhan Nathan Hinchey    7 年前

    a = [(0,0,0), (0,1,1), (1,0,1), (1,1,0)]
    b = [0, 2, 1, 1, 2, 2]
    x = []
    for index in b:
        x += list(a[index])
    
    x = tuple(x)
    
    print(x)
    

    x = tuple(sum(list(a[index]) for index in b))
    

    第一种方法说明:

    • 创建一个变量来保存当前总和
    • 对于中指定的每个索引号 b ,请执行以下操作:
      • 添加 a[index] 总计

    所以在每个循环中, a[索引] a[0] , a[2] a[1] ... a[2]

    sum

        4
  •  1
  •   Ajinkya Chalke    7 年前

    减少方法。

    from functools import reduce
    x = reduce(lambda p, q: p + q, [a[i] for i in b])
    
        5
  •  0
  •   toom501    7 年前

    你是说像这样吗?

    x = 0
    for sub_b in b:
        x = x + a[sub_b]
    
        6
  •  0
  •   Jonas Wolff    7 年前
    tuple(q for i in b for q in a[i])
    

    在这里,第一个循环循环通过b,然后通过一个指向b值的索引,在这个索引中,这里变成了q,因此就创建了生成器,至于tuple(),它的目的是理解是生成器,可以放入数组中,就像对象一样,但是tuple没有,只有在那里的parenthasies,真正的元组是由逗号定义的,但是生成器没有这些,所以我必须明确地告诉它我想要一个元组。