2015-03-27 2 views
3

Это можно сделать в одной строке, используя понимание списка?Умножьте элементы внутренних списков в качестве понимания списка

lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]] 
products = ?? (Multiple each list elements) 

Желаемая выход = [6, 24, 30, 9]

Я пытался что-то вроде:

products = [l[i] * l[i + 1] for l in lst for i in range(len(l) - 1)] 

, но не работает.

+0

Вам также нужен ответ, почему ваш метод не работает? –

ответ

7

Вы можете использовать reduce() применить умножение в список целых чисел, вместе с operator.mul() сделать фактическое умножение:

from functools import reduce 

from operator import mul 

products = [reduce(mul, l) for l in lst] 

В Python 3, reduce() был перемещен в functools.reduce(), следовательно, поддерживает import заявление. Как functools.reduce существует с Python 2.6, это просто легче импортировать его оттуда, если вам нужно, чтобы сохранить ваш код совместим с Python 2 и 3.

Демо:

>>> from operator import mul 
>>> lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]] 
>>> [reduce(mul, l) for l in lst] 
[6, 24, 30, 9] 

operator.mul() можно заменить lambda x, y: x * y но зачем собаке и лаять себя?

+0

Упрощенный для 'mul', я имел тот же ответ в виду, но вместо« лямбды »это было лучше. – miradulo

0

Try:

products = [reduce(lambda x, y: x * y, l) for l in lst] 
1

Да, вы можете использовать reduce и лямбда-выражения в пределах списка понимания:

>>> [reduce(lambda x, y: x * y, innerlst) for innerlst in lst] 
[6, 24, 30, 9] 

Note, в Python 3, reduce был перемещен в functools модуль, так что вы должен импортировать из него там:

from functools import reduce

Если вы не хотите использовать выражение лямбда, его можно полностью заменить operator.mul.

1

Использование this решение для создания оператора продукта для списков вы можете сделать что-то вроде:

lst = [[1, 2, 3], [1, 2, 3, 4], [5, 6], [9]] 
    import operator 
    from functools import reduce # Valid in Python 2.6+, required in Python 3 
    def prod(numeric_list): 
     return reduce(operator.mul, numeric_list, 1) 

    [prod(l) for l in lst] 

Ouput:

Out[1]: [6, 24, 30, 9] 
Смежные вопросы