2016-06-19 66 views
0

的迭代總和說我有一個列表,列表:使用更好的切片發現亞

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 

小背景:可能我的解決方案的一部分,以項目歐拉82

回答

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],因此您可能只想使用它自己的映射。