2009-05-28 12 views
2

Ich möchte eine funktionale wie Musterübereinstimmung tun, um die ersten beiden Elemente zu erhalten, und dann den Rest eines Array-Rückgabewerts.Python - Match auf Array-Rückgabewert

zum Beispiel angenommen, dass perms (x) eine Liste von Werten zurückgibt, und ich möchte, dies zu tun:

seq=perms(x) 
a = seq[0] 
b = seq[1] 
rest = seq[2:] 

Natürlich kann ich verkürzen:

[a,b] = seq[0:2] 
rest = seq[2:] 

Kann ich etwas Notation, um dies zu tun?

[a,b,more] = perms(x) 

oder konzeptuell:

[a,b,more..] = perms(x) 

PROLOG & funktionale Sprachen zu tun, so schön wie diese Zersetzung Liste!

Antwort

2

Für Python 2, ich kenne Sie es mit einer Funktion tun können:

>>> def getValues(a, b, *more): 
    return a, b, more 

>>> seq = [1,2,3,4,5] 
>>> a, b, more = getValues(*seq) 
>>> a 
1 
>>> b 
2 
>>> more 
(3, 4, 5) 

aber nicht sicher, ob es eine Möglichkeit, es zu tun, wie Ayman's Python 3 suggestion

+2

ein wenig kürzer: a, b, m = (lambda a, b, * mehr: (a, b, mehr)) (* seq) – Javier

+0

das ist der weg für python-2.x – van

3

In Python 2, ist Ihre Frage sehr nahe auf eine Antwort bereits:

a, b, more = (seq[0], seq[1], seq[2:]) 

oder:

(a, b), more = (seq[0:2], seq[2:]) 
0

Sehr schön, danke.

Die Vorschläge, wo man das Array auf der Kampfseite seziert, funktionieren für mich nicht so gut, da ich eigentlich Muster auf die Renditen eines Generatorausdrucks anpassen wollte.

für (a, b, mehr) in perms (Seq): ...

Ich mag die P3-Lösung, sondern müssen warten, für Komodo, sie zu unterstützen!