2012-06-23 9 views
5

me gustaría hacer algo como esto¿Asignar contenido de dict de Python a múltiples variables a la vez?

def f(): 
    return { 'a' : 1, 'b' : 2, 'c' : 3 } 

{ a, b } = f()  # or { 'a', 'b' } = f() ? 

es decir, de modo que una se le asigna 1, b consigue 2, y c es indefinido

Esto es similar a este

def f() 
    return(1,2) 

a,b = f() 
+0

¿Por qué quieres hacer esto? Ya tiene los datos en el diccionario y puede obtenerlos fácilmente: 'd = f(); d ['a'] # ... 'Si realmente quieres volver a unir los nombres:' d = f(); a, b = d ['a'], d ['b'] '¿Falta algo? –

Respuesta

8

No tendría ningún sentido para desempaquetar a depender de los nombres de las variables. Lo más cerca que se puede conseguir es:

a, b = [f()[k] for k in ('a', 'b')] 

Esto, por supuesto, evalúa f() dos veces.


Se podría escribir una función:

def unpack(d, *keys) 
    return tuple(d[k] for k in keys) 

Luego hacer:

a, b = unpack(f(), 'a', 'b') 

Esto es realmente todo una exageración sin embargo. Algo simple sería mejor:

result = f() 
a, b = result['a'], result['b'] 
+0

Hmm ... bien thx @Eric, pero el punto es evitar la redundancia de escribir los nombres de las variables dos veces. Solo estoy mirando la forma más fácil de ir del diccionario a las variables. Una cosa similar que me gustaría hacer sería algo como esto ' table = [{'a': 1, 'b': 2}, {'a': 5, 'b': 6}, .. .] para a, b en la tabla: ... hacer algo más que para mydict en la tabla: a, b = mydict [ 'a'], mydict [ 'b'] ...hacer algo ' – joelhoro

+1

@cozycoding: ¿Por qué lo necesita? Deje los datos en el diccionario! – Eric

+0

@cozycoding: (edición WRT) Si usa clases en lugar de diccionarios, podría hacer 'para el elemento en la tabla: foo (item.a, item.b)'. – Eric

3

Hmm. Es extraño porque no se ordena un diccionario, por lo que el desempaquetado del valor depende de los nombres de las variables. Pero, es posible, si feo:

>>> locals().update(f()) 
>>> a 
1 

¡No intente esto en casa! Es una pesadilla de mantenimiento. Pero un poco frío también :-)

+5

Tenga en cuenta que los documentos Python especifican que no debe mutar el resultado de 'locals()'. Podría funcionar bien ahora, pero en algún momento en el futuro este código podría arrojar una excepción, o peor, hacer algo completamente no sensato. –

+1

@Geoff: es bueno saberlo. Aún más razón para no usar esto :-) – Cameron

+0

@Cameron - ¡cuenta conmigo para evitar eso! Thx – joelhoro

5

considere hacer una fnamedtuple continuación, sólo puede utilizar f.a, f.b directamente

0

usted podría utilizar (o abuso) un atributo de función para hacer esto:

>>> def f(): 
... f.a=1 
... f.b=2 
... return { 'a' : f.a, 'b' : f.b, 'c' : 3 } 
... 
>>> f() 
{'a': 1, 'c': 3, 'b': 2} 
>>> a,b=f.a,f.b 
>>> a,b 
(1, 2) 

Tenga en cuenta que los atributos solo tienen valor después de llamar a f() o asignarlos manualmente.

I (raramente) la función de utilizar atributos como relleno para las variables de clase de C static así:

>>> def f(i): 
... f.static+=i 
... return f.static 
>>> f.static=0 
>>> f(1) 
1 
>>> f(3) 
4 

Hay mejores maneras de hacer esto, pero sólo para estar completa ...

Cuestiones relacionadas