多个清单的总和

时间:2018-09-15 22:47:11

标签: python

下面如何简化对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 个答案:

答案 0 :(得分:2)

您将/通常可以使用此表达式执行您想要的操作:

sum(a[x] for x in b)

但是,在您的情况下,元组a的元素,如果尝试此操作,将会出错。您需要列出一个元组列表,然后使用itertools中的chain将其展平。

from itertools import chain

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

或者:

x = tuple(chain(*a[x] for x in b))

答案 1 :(得分:2)

尝试一下,需要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 :(得分:1)

尝试一下:

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[index]变为a[0]a[2]a[1] ... a[2]

sum方法中,随着函数采用生成器表达式并将其耗尽,这些循环被加在一起。

答案 3 :(得分:1)

减少方法。

from functools import reduce
x = reduce(lambda p, q: p + q, [a[i] for i in b])

答案 4 :(得分:0)

tuple(q for i in b for q in a[i])

在这里,第一个循环遍历b,然后遍历对应的b的索引,在这里成为q,从而生成了生成器,对于tuple()而言,其目的是使理解成为生成器和可以放入对象之类的数组中,但是元组却没有,圆括号只是那个,真正的元组由逗号定义,但是生成器没有那些,所以我必须明确地告诉它我想要一个元组。 / p>

答案 5 :(得分:0)

你是这个意思吗?

x = 0
for sub_b in b:
    x = x + a[sub_b]