2016-01-18 4 views
0

Я новичок, чтобы перечислить понимание, и я хотел бы что-то сделать с кортежами. Так вот в чем проблема:Выполнение расчета в кортежах при понимании списка

Данные два вектора l1 и l2, я хочу объединить их в кортежи. Затем я хотел бы умножить их, прежде чем суммировать их все.

Так, например, если у меня есть l1 = [1,2,3] и l2 = [4,5,6], я хотел бы объединить их с функцией zip в [(1,4),(2,5),(3,6)].

После этого я хочу умножить и добавить 1 в кортежи. Так что это будет [(1*4)+1,(2*5)+1,(3*5)+1], давая [4,11,16]

После этого я хочу подвести список вверх в 4+11+16 который должен дать 31.

Я узнал tuple(map(operator.add, a, b)), перед которым можно сложить tupples. Но так как теперь мне нужно сделать еще один расчет, я понятия не имею, как начать. Будет хорошо, если это можно сделать в одной строке со списком. У кого-то появилась идея?

ответ

3

Рассмотрим:

sum(a * b + 1 for a, b in zip(l1, l2)) 

Смотрите, что:

>>> l1 = [1,2,3]; l2 = [4,5,6] 
>>> sum(a * b + 1 for a, b in zip(l1, l2)) 
35 
0

Я думаю, что ваши расчеты поодаль, но вы хотите этого?

>>> l1 = [1,2,3] 
>>> l2 = [4,5,6] 
>>> l3 = zip(l1, l2) 
>>> l3 
[(1, 4), (2, 5), (3, 6)] 
>>> l4 = [i*j for i, j in l3] 
>>> l4 
[4, 10, 18] 
>>> l5 = [x+1 for x in l4] 
>>> l5 
[5, 11, 19] 
>>> sum(l5) 
35 
0

Попробуйте это:

>>> l1 = [1,2,3] 
>>> l2 = [4,5,6] 
>>> sum([(i*j)+1 for (i, j) in zip(l1, l2)]) 
35 
0

реализации с картой

def f(xs, ys, k=1): 
    """ 
    xs : first list 
    ys : second list 
    k : sum constant -- problem case = 1 
    """ 
    return sum(map(lambda x, y: x*y + k, xs, ys)) 

print f([1,2,3],[4,5,6], 1) == 35