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