2016-03-20 5 views
1

У меня есть два списка:Python Умножение двух списков

list_a = list_b = list(range(2, 6)) final_list = []

мне было интересно, как умножить все значения в обоих списках вместе. Я хочу, чтобы мой final_list содержать

[2*2, 2*3, 2*4, 2*5, 3*2, 3*3, 3*4, 3*5, 4*2, 4*3, 4*4, 4*5, 5*2, 5*3, 5*4, 5*5]

+5

Будьте осторожны, когда вы делаете 'list_a = list_b = ...', потому что обе переменные будут ссылаться на один и тот же «список». Кстати, нет никакой реальной необходимости конвертировать 'range' в' list' в python ('range' не являются генераторами). – Holt

+2

@soon Нет, 'range' возвращает пользовательский тип, см. [' Range'] (https://docs.python.org/3/library/stdtypes.html#range). Попробуйте 'range (10) [4]' в python3 или 'a = range (10); печать (список (а)); print (list (a)); ' – Holt

+0

Должен ли я создавать отдельные списки list_a и list_b? – RandomCoder

ответ

9

Вы можете использовать список понимание:

>>> list_a = list_b = list(range(2, 6)) 
>>> [x*y for x in list_a for y in list_b] 
[4, 6, 8, 10, 6, 9, 12, 15, 8, 12, 16, 20, 10, 15, 20, 25] 

Обратите внимание, что list_a = list_b = list(range(2, 6)) делает обе переменные указывают на тот же объект списка. Если это нежелательно, использовать отдельные списки:

>>> list_a, list_b = list(range(2, 6)), list(range(2, 6)) 
5

itertools.product может быть использован для получения декартово произведения из произвольного числа итерируемых.

import itertools 
l1 = range(2,6) 
l2 = range(2,6) 
result = [x*y for x, y in itertools.product(l1, l2)] 

Для обработки общего случая вы можете использовать подход уменьшения. Это будет отлично работать для произвольного количества входных последовательностей.

import functools 
import operator 
import itertools 
result = [functools.reduce(operator.mul, operands) 
      for operands in itertools.product(l1, l2)] 
Смежные вопросы