列表:使用更好的切片来查找子集的迭代总和

时间:2016-06-19 19:36:47

标签: python list slice reduce

说我有一个清单,

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的解决方案的一部分

1 个答案:

答案 0 :(得分: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)

如果只是为j<=i[i,j]设置映射,则无需检查[j,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]进行协调,因此您可能只想自己使用映射。