2016-06-19 7 views
0

Sagen wir, ich habe eine Liste,Listen: besser schneiden mit iterativen Summen von Untergruppen finden

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

B, ist das Endergebnis, eine Liste von Listen ist. Gegeben i und j, wie würden Sie eine Liste von iterativen Summen machen, wo Index i Grenzen der einen Seite und j der andere?

B[j] = sum(A[j:i+1] or A[i:j+1]) je nachdem, ob j oder i größer ist.

Beispiele für Indizes 0 und 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] 

======

Aktuelle Code (Werke) sind zwei for Schleifen, sehr brutale Gewalt. Ich denke, es sollte eine Möglichkeit geben, reduce zu verwenden?

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 

Minor Kontext: möglicherweise ein Teil meiner Lösung euler 82

Antwort

1

Sie die Summen oft neu berechnet am Ende zu projizieren. Statt sie einmal erstellen und sie für jedes Element von b nachschauen:

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) 

Sie die Notwendigkeit zu beseitigen, könnte zu überprüfen j<=i, wenn Sie nur die Arbeit Mapping machen sowohl für [i,j] oder [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)] 

Obwohl Beachten Sie, dass dies bedeutet, dass jeder B[x][y] wird direkt zu mapping[x,y] koordinieren, so dass Sie nur das Mapping von sich selbst verwenden möchten.

Verwandte Themen