python - 在给定范围内查找列表的所有可能子列表的高效和 Pythonic 方法,以及将其中的所有元素相乘后的最小乘积?

标签 python list python-2.7 python-3.x reduce

我已经实现了这两件事。

  1. 在给定范围 (i ,j) 中找到列表的所有可能子列表。

    A = [ 44, 55, 66, 77, 88, 99, 11, 22, 33 ] 
    Let, i = 2 and j = 4
    

    然后,给定范围 (2,4) 中列表 "A" 的可能子列表是:

    [66], [66,77], [66,77,88], [77], [77,88], [88]
    
  2. 并且,将子列表的所有元素相乘后的结果乘积的最小值:

    因此,将上述子列表中的所有元素相乘后的结果列表将变为

    X = [66, 5082, 447216, 77, 6776, 88]`    
    

    现在,上面列表的最小值,即 min(X)66

我的代码:

i, j = 2, 4
A = [ 44, 55, 66, 77, 88, 99, 11, 22, 33 ] 
O, P = i, i
mini = A[O]
while O <= j and P <= j:
    if O == P:
        mini = min(mini, reduce(lambda x, y: x * y, [A[O]]))
    else:
        mini = min(mini, reduce(lambda x, y: x * y, A[O:P + 1]))
    P += 1
    if P > j:
        O += 1
        P = O
print(mini)

我的问题:

对于更大的列表和更大的范围,这段代码需要更多的时间来执行!
是否有任何可能的“Pythonic”方式来降低上述代码的时间复杂度?

提前致谢!

编辑:

明白了。但是,如果有多个这样的可能子列表具有相同的最小产品,

  1. 我需要最长的子列表范围 (i,j)
  2. 如果还有多个子列表具有相同的“最长子范围”,我需要打印具有最低起始索引的子间隔。


考虑这个列表 A = [2, 22, 10, 12, 2] 如果 (i,j) = (0,4)
有一条领带。 Min product = 2 有两种可能性 '(0,0)' 和 '(4,4)'
两个子列表范围 = 0 [ (0-0) 和 (4-4) ]
在这种情况下,我需要 print (minproduct, [sublist-range]) = 2, [0,0]

尝试使用字典,它适用于某些输入但不适用于所有输入!如何“有效地”做到这一点?
谢谢!

最佳答案

首先,给定列表和索引范围,我们可以得到子列表A[i : j + 1]

[66, 77, 88]

对于正整数aba * b不小于a b。所以你不需要做乘法,两个或多个元素相乘不可能有更小的结果。此列表的最小值所有相乘结果的最小值。

所以结果是:

min(A[i : j + 1])

关于python - 在给定范围内查找列表的所有可能子列表的高效和 Pythonic 方法,以及将其中的所有元素相乘后的最小乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820997/

相关文章:

java - 从搜索数组的方法返回 boolean 值

c - 尝试实现我自己的列表时出现内存错误

python - Django 将选定的对象从表单传递到另一个表单

python - 在 Pandas Dataframe 中为字符串添加前导零

python - 嵌套列表操作

python - AttributeError : 'int' object has no attribute 'state'

python - 下面的代码片段有什么问题?

python - 为什么在 Python OOP 中使用 Getters/Accessors 是(或不是)好的做法?

python - MLFLow 工件在远程服务器上记录和检索

Python-将字符串排序到列