【问题标题】:Creating a new list by multiplying each value in a list with the values of another list [duplicate]通过将列表中的每个值与另一个列表的值相乘来创建新列表[重复]
【发布时间】: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


【解决方案1】:

@CDJBs 的回答是正确的,它也可以在没有 itertools 的情况下完成。

[i*j for j in A for i in B]

这也有效,但我认为 itertools 更快

【讨论】:

    【解决方案2】:

    虽然您可以使用 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])
    

    【讨论】:

      【解决方案3】:

      为此,您可以使用itertools.product 来迭代AB 的所有成对组合。

      >>> import itertools
      >>> C = [a*b for a,b in itertools.product(A,B)]
      >>> C
      [4, 5, 6, 8, 10, 12, 12, 15, 18]
      

      【讨论】:

        【解决方案4】:

        出于好奇,我对@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
        

        【讨论】:

        • 据我了解,numpy 有一个 C 后端,在迭代列表时应始终使用。
        【解决方案5】:
        A = [1,2,3]
        B = [4,5,6] 
        C= []
        for i in A:
          for j in B:
            C.append(int(i)*int(j))
        

        【讨论】:

          猜你喜欢
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 2021-07-10
          • 1970-01-01
          • 2015-02-12
          相关资源
          最近更新 更多