2010-03-28 11 views
8

Gli esempi da manuale di assegnazione multipla disimballaggio sono qualcosa di simile:multipla Assegnazione Apertura della confezione in Python quando non si conosce la lunghezza della sequenza

import numpy as NP 
M = NP.arange(5) 
a, b, c, d, e = M 
# so of course, a = 0, b = 1, etc. 

M = NP.arange(20).reshape(5, 4)  # numpy 5x4 array 
a, b, c, d, e = M 
# here, a = M[0,:], b = M[1,:], etc. (ie, a single row of M is assigned each to a through e) 

(My Q non è specfic NumPy, anzi, io preferirei un puro soluzione python)

W/r/t il pezzo di codice che sto guardando ora, vedo due complicazioni in questo scenario semplice:.

  • Io di solito non conoscerò la forma di M; e

  • voglio decomprimere un certo numero di elementi (sicuramente meno di tutti gli articoli) e voglio mettere il resto in un contenitore singolo

modo nuovo al 5x4 array sopra, quello che mi piacerebbe molto essere in grado di fare è, ad esempio, assegnare le prime tre righe di M a a, b e c rispettivamente (esattamente come sopra) e il resto delle righe (ho non ho idea di quanti saranno, solo alcuni interi positivi) in un unico contenitore, tutti_i_r est = [].

Non sono sicuro di averlo spiegato chiaramente; in ogni caso, se ricevo un feedback, correggerò prontamente la mia domanda.

risposta

16

Python 3.x può farlo facilmente:

a, b, *c = someseq 

Python 2.x ha bisogno di un po 'più di lavoro:

(a, b), c = someseq[:2], someseq[2:] 
+1

La soluzione 2.x non funziona. Le cose che stai spacchettando non corrispondono. –

+2

Per risolvere la soluzione 2.x, tutto ciò che serve è una parentesi intorno a e b, in modo che il numero di valori da assegnare corrispondenze. cioè (a, b), c = someseq [: 2], someseq [2:] ' – mjv

7

sintassi per questo viene aggiunto a Python 3

>>> # Python 3.x only 
>>> a, b, *c = range(10) 
>>> a 
0 
>>> b 
1 
>>> c 
[2, 3, 4, 5, 6, 7, 8, 9] 

ma nessuna soluzione simile esiste in Python 2.

Ovviamente puoi fare

>>> s = range(10) 
>>> s 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> (a, b, c), rest = s[0:3], s[3:] 
>>> a 
0 
>>> b 
1 
>>> c 
2 
>>> rest 
[3, 4, 5, 6, 7, 8, 9] 

o altre soluzioni simili.

+0

Esiste una soluzione python 2 (vedere l'altra risposta) - da qui il downvote. –

+0

La soluzione Python 2 dell'altro post è la stessa del mio ... –

+0

Concordato - ma è confuso quando si afferma che non esiste una soluzione simile in Python 2 - Suggerirei che esiste una soluzione simile in Python 2, ma la sintassi è diversa ed è leggermente meno "automatica". –

Problemi correlati