【问题标题】:Find product of all sublist's elemens of a list查找列表的所有子列表元素的乘积
【发布时间】:2020-07-18 00:36:16
【问题描述】:

我们有一个清单,让我们来看看

lst = [1,2,3,4,5]

我希望结果是所有子列表元素的乘积
例如:

result = [1,2,3,4,5,2,6,24,120,6,24,120,12,60,20]

在最短的时间内

对上述结果的解释是 lst 的子集是:

sublist = [[1],[2],[3],[4],[5],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[2,3],[2,3,4],[2,3,4,5],[3,4],[3,4,5],[4,5]]

我试过了,但是它的运行时间非常长

N=[1,2,3,4]
X=[]
for i in range(len(N)+1):
    for j in range(len(N)+1):
        c=N[i:j]
        X.append(c)

print(X)
X2 = [x for x in X if x != []]
print(X2)

S=[]
for i in X2:
    p=1 
    for j in i:
        p=p*j 
    S.append(p)

print(S)

【问题讨论】:

    标签: python python-3.x list time runtime


    【解决方案1】:

    如果您使用 range(len(N)) 并使用 N[i:j+1] 您将形成所有没有空数组的子数组。在我的解决方案中不需要X,但我把它留在那里。使用此代码,您可以减少乘法,因为您可以重复使用先前子数组乘法的结果:

    N=[1,2,3,4,5,6,7,8,9,10]
    #X=[]
    S=[]
    for i in range(len(N)):
        p=1
        for j in range(i, len(N)):
            p=p*N[j]
            #X.append(N[i:j+1])
            S.append(p)
    
    #print(X)
    print(S)
    

    【讨论】:

    • 仍然需要更多时间来获得更长的列表 N
    • @ArJunGawali 您可以尝试取出 X 的代码,它会有所改善。没有它在 O(N^2) 上运行,解决方案的大小为 O(N^2),很难更快地做某事
    • @ArJunGawali 大数乘法需要时间...我尝试使用大数组 N=[1,1,1,1,1,...] 并且没有 X,速度相当快。
    【解决方案2】:

    乘法越小越好。

    nums = [1, 2, 3, 4, 5]
    
    
    def all_product(nums: list):
        products = []
        numbers = len(nums)
        for i in range(numbers):
            products.append(nums[i])
            for j in range(i + 1, numbers):
                products.append(products[-1] * nums[j])
        return list(products)
    
    
    print(sorted(all_product(nums)))
    # [1, 2, 2, 3, 4, 5, 6, 6, 12, 20, 24, 24, 60, 120, 120]
    
    print(sorted([1, 2, 3, 4, 5, 2, 6, 24, 120, 6, 24, 120, 12, 60, 20]))
    # [1, 2, 2, 3, 4, 5, 6, 6, 12, 20, 24, 24, 60, 120, 120]
    
    

    【讨论】:

      【解决方案3】:

      使用numpy.proditertools.combinations。 这是你想要的代码。

      import itertools
      import numpy as np
      lst = [1,2,3,4,5]
      result = []
      for r in range(1, len(lst) + 1):
          for val in itertools.combinations(lst, r):
              result.append(np.prod(val))
      

      结果是 [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 6, 8, 10, 12, 15, 20, 24 , 30, 40, 60, 24, 30, 40, 60, 120, 120]。

      【讨论】:

      • OP是否只想要连续数字的乘积?
      • 我认为这还不够快。您可以记住乘法的每个答案。
      • 我想要连续数字的产品
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多