ordereddict - sorted python dictionary by key
contenido del diccionario de ligadura de desestructuración de Python (8)
Bueno, si quieres estos en una clase siempre puedes hacer esto:
class AttributeDict(dict):
def __init__(self, *args, **kwargs):
super(AttributeDict, self).__init__(*args, **kwargs)
self.__dict__.update(self)
d = AttributeDict(a=1, b=2)
Estoy tratando de ''destruir'' un diccionario y asociar valores con nombres de variables después de sus claves. Algo como
params = {''a'':1,''b'':2}
a,b = params.values()
pero como los diccionarios no están ordenados, no hay garantía de que params.values () devuelva valores en el orden de (a, b). ¿Hay una buena manera de hacer esto?
Gracias
No sé si es buen estilo, pero
locals().update(params)
Hará el truco. Luego, tiene a
, b
y lo que haya en sus params
disponibles como variables locales correspondientes.
Python solo puede "destruir" secuencias, no diccionarios. Por lo tanto, para escribir lo que desee, deberá asignar las entradas necesarias a una secuencia adecuada. A partir de mí, la coincidencia más cercana que pude encontrar es la (no muy sexy):
a,b = [d[k] for k in (''a'',''b'')]
Esto funciona también con generadores:
a,b = (d[k] for k in (''a'',''b''))
Aquí hay un ejemplo completo:
>>> d = dict(a=1,b=2,c=3)
>>> d
{''a'': 1, ''c'': 3, ''b'': 2}
>>> a, b = [d[k] for k in (''a'',''b'')]
>>> a
1
>>> b
2
>>> a, b = (d[k] for k in (''a'',''b''))
>>> a
1
>>> b
2
Si le temen los problemas relacionados con el uso del diccionario local y prefiere seguir su estrategia original, los Diccionarios Ordenados de las collections.OrderedDicts de Python 2.7 y 3.1. LosDictos de Pedido le permiten recuperar los elementos del diccionario en el orden en que se insertaron por primera vez.
Tal vez realmente quieres hacer algo como esto?
def some_func(a, b):
print a,b
params = {''a'':1,''b'':2}
some_func(**params) # equiv to some_func(a=1, b=2)
Una forma de hacer esto con menos repetición que la sugerencia de Jochen es con una función de ayuda. Esto le da la flexibilidad de enumerar sus nombres de variables en cualquier orden y solo destruir un subconjunto de lo que está en el dict:
pluck = lambda dict, *args: (dict[arg] for arg in args)
things = {''blah'': ''bleh'', ''foo'': ''bar''}
foo, blah = pluck(things, ''foo'', ''blah'')
Además, en lugar de OrderedDict de Joaquín, puede ordenar las claves y obtener los valores. Las únicas capturas son las que necesita para especificar los nombres de sus variables en orden alfabético y desestructurar todo en el dictado:
sorted_vals = lambda dict: (t[1] for t in sorted(dict.items()))
things = {''foo'': ''bar'', ''blah'': ''bleh''}
blah, foo = sorted_vals(things)
prueba esto
d = {''a'':''Apple'', ''b'':''Banana'',''c'':''Carrot''}
a,b,c = [d[k] for k in (''a'', ''b'',''c'')]
resultado:
a == ''Apple''
b == ''Banana''
c == ''Carrot''
from operator import itemgetter
params = {''a'': 1, ''b'': 2}
a, b = itemgetter(''a'', ''b'')(params)
En lugar de las funciones lambda elaboradas o la comprensión del diccionario, también se puede utilizar una biblioteca integrada.