2013-07-10 6 views
1

Я хочу последовательно умножать смежный элемент списка и добавить умножение:Multiply соседние элементы списка и добавить их

  • ([1,2,3,4]) должен выполнять (1*2+2*3+3*4) и
  • [1,2,3] Я хочу, чтобы получить 8 потому что (1*2)+(2*3)
+1

Что-то не ясно, о чем вы спрашиваете, либо ваши примеры неправильно - или вы не * умножения * , 1 раз 2 раза 3 - 6, а не 8. –

+0

По существу то же самое, что и http://stackoverflow.com/q/14916957/1907098, за исключением того, что вы «суммируете» результирующий список. – Volatility

+0

Похоже, вам нужно «свернуть» или «zip» ... – Shark

ответ

1

Функция с помощью sum, map, lambda и zip

def my_math(lst): 
    return sum(map(lambda x: x[0]*x[1], zip(lst, lst[1:]))) 

>>> my_math([1,2,3]) 
8 
>>> my_math([1,2,3,4]) 
20 
>>> my_math([1,2,3,4,5]) 
40 
+0

Это то, что я подумал и о «многократных элементах», но посмотрите на примеры, которые дает OP в теле вопроса. – delnan

+0

@InbarRose Почему карта (* zip) не работает? – ersran9

+1

@ ersran9 Вы имеете в виду 'map (mul, ...)' one? 'mul' принимает два аргумента и, к сожалению, не поддерживает передачу одного итерабельного. – poke

3

Использование списка понимание:

>>> mylist = [1,2,3,4] 
>>> sum(mylist[i] * mylist[i + 1] for i in range(len(mylist) - 1)) 
20 
3

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

x=[1,2,3,4] 
print sum(a*b for a,b in zip(x, x[1:])) 
#prints 20 
+4

+1. Вы можете сбросить '[: -1]', 'print sum (a * b для a, b в zip (x, x [1:]))' производит тот же результат – iruvar

+0

Обновлено. Благодарю. –

3

Использование pairwise itertools recipe:

>>> sum(a * b for (a, b) in pairwise([1, 2, 3, 4])) 
20 
>>> sum(a * b for (a, b) in pairwise([1, 2, 3])) 
8 

Что мне нужно чан ge если хотите function([1,2,3,4]) выступить (1*2*3*4)?

>>> from functools import reduce 
>>> from operator import mul 
>>> reduce(mul, [1, 2, 3, 4]) 
24 
+0

Что мне нужно для выполнения функции ifhen ([1,2,3,4]) выполнить (1 * 2 * 3 * 4)? – user2469891

+0

@ user2469891 См. Мое редактирование. – poke

0
In [88]: mylist = [1,2,3,4] 

In [89]: sum(itertools.imap(lambda t: operator.mul(*t), itertools.izip(mylist, itertools.islice(mylist, 1, len(mylist))))) 
Out[89]: 20 
0

Выражение генератор без каких-либо списков срезов/копий

>>> mylist = [1,2,3,4] 
>>> sum(mylist[i-1] * j for i, j in enumerate(mylist) if i) 
20 
Смежные вопросы