Variables de Python como claves para dict.

¿Hay una forma más fácil de hacer esto en Python (2.7) ?: Nota: Esto no es nada sofisticado, como poner todas las variables locales en un diccionario. Solo los que especifico en una lista.

apple = 1 banana = 'f' carrot = 3 fruitdict = {} # I want to set the key equal to variable name, and value equal to variable value # is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}? for x in [apple, banana, carrot]: fruitdict[x] = x # (Won't work) 

 for i in ('apple', 'banana', 'carrot'): fruitdict[i] = locals()[i] 

La función globals() devuelve un diccionario que contiene todas sus variables globales.

 >>> apple = 1 >>> banana = 'f' >>> carrot = 3 >>> globals() {'carrot': 3, 'apple': 1, '__builtins__': , '__name__': '__main__', '__doc__': None, 'banana': 'f'} 

También hay una función similar llamada locals() .

Me doy cuenta de que esto probablemente no sea exactamente lo que desea, pero puede proporcionar alguna información sobre cómo Python proporciona acceso a sus variables.

Edición : Parece que su problema puede resolverse mejor simplemente usando un diccionario en primer lugar:

 fruitdict = {} fruitdict['apple'] = 1 fruitdict['banana'] = 'f' fruitdict['carrot'] = 3 

Una sola línea es:

 fruitdict = dict(zip(('apple','banana','carrot'), (1,'f', '3')) 

Basado en la respuesta de mouad, aquí hay una forma más pythonica de seleccionar las variables basadas en un prefijo:

 # All the vars that I want to get start with fruit_ fruit_apple = 1 fruit_carrot = 'f' rotten = 666 prefix = 'fruit_' sourcedict = locals() fruitdict = { v[len(prefix):] : sourcedict[v] for v in sourcedict if v.startswith(prefix) } # fruitdict = {'carrot': 'f', 'apple': 1} 

Incluso puedes poner eso en una función con prefijo y fuente como argumentos.

Aquí está en una línea, sin tener que volver a escribir ninguna de las variables o sus valores:

 fruitdict.update({k:v for k,v in locals().copy().iteritems() if k[:2] != '__' and k != 'fruitdict'}) 

Si desea vincular las ubicaciones de las variables en sí, hay esto:

 >>> apple = 1 >>> banana = 'f' >>> carrot = 3 >>> fruitdict = {} >>> fruitdict['apple'] = lambda : apple >>> fruitdict['banana'] = lambda : banana >>> fruitdict['carrot'] = lambda : carrot >>> for k in fruitdict.keys(): ... print k, fruitdict[k]() ... carrot 3 apple 1 banana f >>> apple = 7 >>> for k in fruitdict.keys(): ... print k, fruitdict[k]() ... carrot 3 apple 7 banana f 

Tratar:

 to_dict = lambda **k: k apple = 1 banana = 'f' carrot = 3 to_dict(apple=apple, banana=banana, carrot=carrot) #{'apple': 1, 'banana': 'f', 'carrot': 3} 

Bueno, esto es un poco, umm … no Pythonic … feo … hackish …

Aquí hay un fragmento de código que asume que desea crear un diccionario de todas las variables locales que crea después de tomar un punto de control específico:

 checkpoint = [ 'checkpoint' ] + locals().keys()[:] ## Various local assigments here ... var_keys_since_checkpoint = set(locals().keys()) - set(checkpoint) new_vars = dict() for each in var_keys_since_checkpoint: new_vars[each] = locals()[each] 

Tenga en cuenta que agregamos explícitamente la clave ‘checkpoint’ en nuestra captura de los locals().keys() También tomo una parte de eso explícitamente, aunque no debería ser necesario en este caso, ya que la referencia debe ser aplanada. agréguelo a la lista [‘punto de control’]. Sin embargo, si estaba usando una variante de este código e intentó atajar la parte ['checkpoint'] + portion (because that key was already in locals () , for example) ... then, without the [:] slice you could end up with a reference to the locals (). keys () `cuyos valores cambiarían a medida que agregaba variables.

De antemano no puedo pensar en una forma de llamar a algo como new_vars.update() con una lista de claves para agregar / actualizar. Así que el bucle for es más portátil. Supongo que un diccionario de comprensión podría utilizarse en versiones más recientes de Python. Sin embargo, eso parece no ser más que una ronda de código de golf.

¿Por qué no haces lo contrario?

 fruitdict = { 'apple':1, 'banana':'f', 'carrot':3, } locals().update(fruitdict) 

Actualización:

No uses el código de arriba revisa el comentario.

por cierto, ¿por qué no marca las vars que quiere obtener? No sé, tal vez así:

 # All the vars that i want to get are followed by _fruit apple_fruit = 1 carrot_fruit = 'f' for var in locals(): if var.endswith('fruit'): you_dict.update({var:locals()[var]) 

Esta pregunta prácticamente ha sido respondida, pero solo quería decir que fue gracioso lo que dijiste

Esto no es nada sofisticado, como poner todas las variables locales en un diccionario.

Porque en realidad es “más elegante”.

lo que quieres es

 apple = 1 banana = 'f' carrot = 3 fruitdict = {} # I want to set the key equal to variable name, and value equal to variable value # is there a more Pythonic way to get {'apple': 1, 'banana': 'f', 'carrot': 3}? names= 'apple banana carrot'.split() # I'm just being lazy for this post items = globals() # or locals() for name in names: fruitdict[name] = items[name] 

Honestamente, lo que está haciendo es simplemente copiar elementos de un diccionario a otro.

(Greg Hewgill prácticamente dio la respuesta completa, acabo de completarla)

… y como sugirió la gente, probablemente deberías poner esto en el diccionario en primer lugar, pero asumiré que por alguna razón no puedes

 a = "something" randround = {} randround['A'] = "%s" % a 

Trabajó.