2010-03-28 22 views
8

Los ejemplos de libros de texto de asignación de desembalaje múltiples son algo así como:Asignación Desembalaje múltiple en Python cuando no se conoce la longitud de la secuencia

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) 

(Mi Q no es specfic numpy y, de hecho, yo preferiría una pura solución pitón)

W/R/T de la pieza de código que estoy viendo ahora, veo a dos complicaciones en ese escenario sencillo:.

  • por lo general no sabrá la forma de METRO; y

  • Quiero desempaquetar un cierto número de artículos (sin duda menos que todos los artículos) y quiero poner el resto en un recipiente sola

así de nuevo a la 5x4 array arriba, lo que me gustaría mucho poder hacer es, por ejemplo, asignar las primeras tres filas de M a a, b, yc respectivamente (exactamente como arriba) y el resto de las filas (tengo no hay idea de cuántos habrá, solo un entero positivo) en un único contenedor, all_the_r est = [].

No estoy seguro de haber explicado esto claramente; en cualquier caso, si recibo comentarios, editaré mi pregunta de inmediato.

Respuesta

16

3.x Python puede hacer esto fácilmente:

a, b, *c = someseq 

Python 2.x necesita un poco más de trabajo:

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

Su solución 2.x no funciona. Las cosas que estás desempaquetando no coinciden. –

+2

Para solucionar la solución 2.x, todo lo que se necesita es un paréntesis alrededor de ayb, de modo que la cantidad de valores a asignar coincida. es decir '(a, b), c = someseq [: 2], someseq [2:]' – mjv

7

Sintaxis para ello se agrega 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] 

pero no existe una solución similar en Python 2.

Puede, por supuesto, hacer

>>> 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] 

u otras soluciones similares.

+0

Hay una solución de pitón 2 (ver la otra respuesta) - de ahí el voto a la baja. –

+0

La solución de Python 2 de la otra publicación es la misma que la de la mía ... –

+0

Estoy de acuerdo, pero es confuso cuando afirma que no hay una solución similar en Python 2, sugeriría que hay una solución similar en Python 2, pero la sintaxis es diferente y es un poco menos "automática". –

Cuestiones relacionadas