2016-05-03 6 views
0

Ich habe versucht, meinen Code pythonischer zu machen, und fragte mich, ob es eine Möglichkeit gibt, diese Zeile irgendwie zu machen.Eine Liste in Python rekursiv erweitern

w=[1, 0, 0, 0, 0, 0, 0, 0] # just an example 
for i in range(170): 
    w.append(w[-2]^w[-3]^w[-4]^w[-8]) 

Ich habe versucht, Lambda-Notation und bekam dies zu verwenden, aber es für Längen funktioniert nicht größer als etwa 50.

[(lambda a:lambda v:a(a,v))(lambda s,x:1 if x==0 else (0 if x < 8 else s(s,x-2)^s(s,x-3)^s(s,x-4)^s(s, x-8)))(k) for k in range(170)] 

Ich habe auch versucht mit Listen Rekursion:

(lambda n: (lambda f, n: f(f, n))(lambda f, n: f(f, n-1)+[f(f, n-1)[-2]^f(f, n-1)[-3]^f(f, n-1)[-4]^f(f, n-1)[-8]] if n > 0 else [1,0,0,0,0,0,0,0], n))(20) 

Ich würde mir vorstellen, dass beide mit Memoization funktionieren würden, aber ich bin mir nicht sicher, wie das inline zu tun ist, wenn es überhaupt möglich ist.

+2

Was Sie, genau das zu tun versuchen? – timgeb

+9

Die erste Version ist klarer und * way * besser lesbar. Wenn man es zu einem One-Liner macht, wird es nicht pythonischer - es wird ein Durcheinander machen ... – alfasin

+0

@timgeb Ich versuche eine runde Konstante für einen Hash-Algorithmus zu berechnen –

Antwort

0

Ich denke, was Sie haben, ist in Ordnung, aber vielleicht ist es in einem Generator drehen wie:

def running_xor(w, n): 
    for i in range(n): 
     yield w[-2]^w[-3]^w[-4]^w[-8] 

w.extend(running_xor(w, 170)) 
+1

würde ich dagegen empfehlen, weil es die Reihenfolge der Ausführung weniger klar macht. Zum Beispiel müssen sich die Leute daran erinnern, dass, während die Slice-Zuweisung den Generator vor dem Ausführen von irgendetwas zum Abschluss bringt, "extend" jedes Element hinzufügt, bevor das nächste vom Generator gezogen wird. – user2357112

+0

Messepunkt. Ich habe zu viele Coroutines benutzt, und jetzt kann ich nicht aufhören! –