2013-12-03 3 views
0

У меня есть два списка чисел, скажем [1, 2, 3, 4, 5] и [7, 8, 9, 10, 11], и я хотел бы создать новый список, который состоит из продуктов каждого члена в первом списке с каждым членом во втором списке , В этом случае в новом списке будет 5 * 5 = 25 элементов.Умножение двух наборов чисел в python

Я не смог сделать это до сих пор с помощью цикла while(). Это то, что я до сих пор:

x = 0 
y = 99 
results = [] 
while x < 5: 
    x = x + 1 
    results.append(x*y) 
while y < 11: 
    y = y + 1 
    results.append(x*y) 
+1

Не могли бы вы опубликовать то, что у вас есть далеко? –

+0

Кстати, как результат 25 в этом случае? –

+0

Я не понимаю, как вы можете получить 25 из списка. – aIKid

ответ

1

Wht dont you try with known old ways;

list1 = range(1, 100) 
list2 = range(10, 50, 5) 

new_values = [] 

for x in list1: 
    for y in list2: 
     new_values.append(x*y) 
+0

Не могли бы вы объяснить это? Не даст ли тот же результат, что и мой взгляд (он будет только умножать все x с одним значением y) –

+0

Нет, он будет захватывать первый «x» и умножать его на все значения «y». Затем возьмите второй «x» и умножьте на все значения 'y' и т. д. ... – FallenAngel

+0

Итак, в основном, внешний цикл будет запускаться один раз, а затем внутренний цикл будет продолжать работать до тех пор, пока он не будет завершен? –

9

Использование itertools.product для получения всех возможных 2-кортежи, а затем вычислить произведение, что:

[x * y for (x, y) in itertools.product([1,2,3,4,5], [7,8,9,10,11])] 
+0

Но это не сработает, если мне нужно умножить больше чисел (например, все числа между 1 и 1000?) –

+0

@AniruddhAgarwal Что вы подразумеваете под этим? Это определенно будет работать для любых двух списков ... –

+0

@SteveP никогда не было, это было недоразумение. –

2

Проблема является примером outer product. Ответ, уже отправленный с itertools.product, - это то, как я это сделал бы.

Но вот альтернатива с numpy, которая обычно более эффективна, чем работа в чистом питоне для хрустания числовых данных.

>>> import numpy as np 
>>> x1 = np.array([1,2,3,4,5]) 
>>> x2 = np.array([7,8,9,10,11]) 
>>> np.outer(x1,x2) 
array([[ 7, 8, 9, 10, 11], 
     [14, 16, 18, 20, 22], 
     [21, 24, 27, 30, 33], 
     [28, 32, 36, 40, 44], 
     [35, 40, 45, 50, 55]]) 
>>> np.ravel(np.outer(x1,x2)) 
array([ 7, 8, 9, 10, 11, 14, 16, 18, 20, 22, 21, 24, 27, 30, 33, 28, 32, 
     36, 40, 44, 35, 40, 45, 50, 55]) 
+0

или вместо внешнего, вы можете сделать x1 [:, None] * x2 [None ,:] (я предполагаю, что это более общее, так как его легко развернуть до x1 * x2 * x3 * ..., а я думаю, np. external не работает с более чем двумя аргументами (исправьте меня, если я ошибаюсь в этом вопросе?) – usethedeathstar

+0

Было бы интересно, если бы модуль 'timeit' имел значение benachmark это и другие предлагаемые решения. К сожалению, у меня нет' numpy' здесь сделайте это сам. –

+0

Я думаю, что понимание будет более быстрым для этого небольшого примера, и numpy обгонит его для больших данных. – wim

1

без каких-либо импортирующей, вы можете сделать:

[x * y for x in range(1, 6) for y in range(7, 12)] 

или в качестве альтернативы:

[[x * y for x in range(1, 6)] for y in range(7, 12)] 

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

+0

Eeek, вложенный список (in) понимания! % -} –

+0

Легко понятный в этом случае, поскольку петли коммутируют – wim

0
from functools import partial 

mult = lambda x, y: x * y 

l1 = [2,3,4,5,5] 
l2 = [5,3,23,4,4] 

results = [] 

for n in l1: 
    results.extend(map(partial(mult, n) , l2)) 

print results 
Смежные вопросы