Давайте начнем с того, что вы пытались. Для цикла:
a = [1,2,3]
b = [4,5,6]
ab = []
for x in a:
for y in b:
ab.append(x * y)
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
Теперь, я хотел бы предложить вы прочитанный здесь python data structures
После того, как вы понимаете, как использовать цикл, понимание списковых легко.
То же самое для цикла, но результаты идут прямо в список. это мило. На самом деле это так приятно, что почти все делают это так.
a = [1,2,3]
b = [4,5,6]
ab = [ x * y for x in a for y in b ]
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
так, вместо for ... ab.append(x * y)
мы пишем [ x * y for ... ]
теперь, если код был написан так:
ab = (x * y for x in a for y in b)
это сделало бы его генератор. Многие люди тоже используют их. Подумайте об этом как о ленивых списках. Вы можете поместить в него вещи, но это не оценивается, пока вы не попытаетесь что-то сделать с ним.
print(ab)
<generator object <genexpr> at 0x4d7058>
print(list(ab))
[4, 5, 6, 8, 10, 12, 12, 15, 18]
если вы «были» пытается решить эту проблему с помощью индексов, я бы, вероятно, использовать:
[a[x] * b[y] for x,_a in enumerate(a) for y,_b in enumerate(b)]
вы также можете сделать забавные вещи, как:
from operator import mul
a = [1,2,3]
b = [4,5,6]
ab = list(map(mul, a,b))
print(ab)
[4, 10, 18]
если вы использовали :
ab = map(mul, a,b)
Вы бы создали e объект карты ... который очень похож на <generator>
.
print(ab)
>>> <map object at 0x4d4eb0>
print(list(ab))
>>> [4, 10, 18]
или если у вас было три списка:
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
abc = list(map(lambda x,y,z: x * y * z, a,b,c))
print(abc)
[28, 80, 162]
и если вы действительно хотели, чтобы вы могли сделать:
from itertools import product
from functools import reduce
from operator import mul
a = [1,2,3]
b = [4,5,6]
ab = list(map(lambda x: reduce(mul,x), product(a,b)))
--or--
ab = list(map(lambda x: mul(*x), product(a,b)))
print(ab)
[4, 5, 6, 8, 10, 12, 12, 15, 18]
. .. и откуда взялся? –
Не считая всех других проблем с вашим кодом, почему вы не хотите использовать numpy для начала? Потому что с numpy решением будет 'a = numpy.array ([[1, 2, 3]]); b = numpy.array ([[4, 5, 6]]); multi = (a * bT) .flatten() ', и в то время как версия, отличная от numpy, с использованием списков, выполняется быстрее для трехэлементных списков, которые вы использовали в качестве примера, когда вы получаете хотя бы 10 элементов в списке, версия numpy будет быстрее. – JAB
(На моем компьютере: с 3 элементами в списке требуется около 9 секунд для версии numpy и 3 секунды для версии без numpy, в то время как по 10 в списке требуется около 10 секунд для версии numpy и 16 секунд для non-numpy one.) – JAB