【问题标题】:Lists: using better slicing to find iterative sums of subsets列表:使用更好的切片来查找子集的迭代和
【发布时间】:2016-10-21 00:49:32
【问题描述】:

假设我有一个清单,

A = range(1, 6) = [1, 2, 3, 4, 5]

B,最终结果是一个列表列表。给定ij,您将如何列出索引i 界定一侧和j 另一侧的迭代和?

B[j] = sum(A[j:i+1] or A[i:j+1]) 取决于 ji 是否更大。

索引 0 和 2 的示例:

B[0] = [1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5]
     = [1, 3, 6, 10, 15]
B[2] = [1+2+3, 2+3, 3, 3+4, 3+4+5]
     = [6, 5, 3, 7, 12]

======

当前代码(有效)是两个for 循环,非常暴力。我觉得应该有办法使用reduce

A = range(1,6)
n = len(A)
B = []
for j in xrange(n):
    b = []
    for i in xrange(n):
        if j <= i:
            b.append(sum(A[j:i+1]))
        else:
            b.append(sum(A[i:j+1]))
    B.append(b)

# print
for b in B:
    print b

次要背景:可能是我对 euler 82 项目的解决方案的一部分

【问题讨论】:

    标签: python list slice reduce


    【解决方案1】:

    您最终会多次重新计算总和。而是创建一次并为b 的每个元素查找它们:

    A = range(1,6)
    n = len(A)
    mapping = {}
    for i in xrange(n):
        for j in xrange(i,n):
            mapping[i,j] = sum(A[i:j+1])
    
    B = []
    for j in xrange(n):
        b = []
        for i in xrange(n):
            if j <= i:
                b.append(mapping[j,i])
            else:
                b.append(mapping[i,j])
        B.append(b)
    

    如果您只为[i,j][j,i] 进行映射,则无需检查j&lt;=i

    mapping = {}
    A = range(1,6)
    n = len(A)
    for i in xrange(n):
        for j in xrange(i,n):
            mapping[i,j] = sum(A[i:j+1])
            mapping[j,i] = mapping[i,j] #for both ways
    
    B = [[mapping[i,j] for i in xrange(n)] for j in xrange(n)]
    

    虽然请注意,这意味着每个B[x][y] 将直接与mapping[x,y] 协调,因此您可能只想单独使用映射。

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2015-01-24
      • 2015-02-04
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      相关资源
      最近更新 更多