【发布时间】:2020-02-17 08:34:12
【问题描述】:
我有两个列表:
A = [1,2,3]
B = [4,5,6]
如何获得一个新列表 C,它应该包含两个列表中每个值的乘积。
我的最终输出应该是
C = [4,5,6,8,10,12,12,15,18]
【问题讨论】:
标签: python python-3.x list math combinations
我有两个列表:
A = [1,2,3]
B = [4,5,6]
如何获得一个新列表 C,它应该包含两个列表中每个值的乘积。
我的最终输出应该是
C = [4,5,6,8,10,12,12,15,18]
【问题讨论】:
标签: python python-3.x list math combinations
@CDJBs 的回答是正确的,它也可以在没有 itertools 的情况下完成。
[i*j for j in A for i in B]
这也有效,但我认为 itertools 更快
【讨论】:
虽然您可以使用 itertools.product 并按照其他答案的建议使用列表,但我建议您在此处使用 NumPy。您可以使用np.multiply.outer 并使用ravel 展平结果:
A = np.array([1,2,3])
B = np.array([4,5,6])
np.multiply.outer(A,B).ravel()
# array([ 4, 5, 6, 8, 10, 12, 12, 15, 18])
【讨论】:
为此,您可以使用itertools.product 来迭代A 和B 的所有成对组合。
>>> import itertools
>>> C = [a*b for a,b in itertools.product(A,B)]
>>> C
[4, 5, 6, 8, 10, 12, 12, 15, 18]
【讨论】:
出于好奇,我对@yatu、@cdjb 和@shadesfear 的解决方案进行了计时。 Numpy 是最快的,Itertools 是最慢的。差别如此之大,让我怀疑我对 Numpy 在这里的工作原理的理解:
>>> import timeit
>>>
>>> setup_nested_for = 'A = [i for i in range(256)]; B = [i for i in range(256)]'
>>> setup_itertools = 'import itertools; ' + setup_nested_for
>>> setup_numpy = 'import numpy; A = numpy.array([i for i in range(256)]); B = numpy.array([i for i in range(256)])'
>>>
>>> timeit.timeit(stmt='[a * b for a in A for b in B]', setup=setup_nested_for, number=10000)
37.95282502599912
>>> timeit.timeit(stmt='[a * b for a, b in itertools.product(A, B)]', setup=setup_itertools, number=10000)
47.30394076399898
>>> timeit.timeit(stmt='numpy.multiply.outer(A, B).ravel()', setup=setup_numpy, number=10000)
1.2109698210006172
【讨论】:
A = [1,2,3]
B = [4,5,6]
C= []
for i in A:
for j in B:
C.append(int(i)*int(j))
【讨论】: