167 votes

Contenu du dictionnaire Destructuring-bind

J'essaie de « déstructurer » un dictionnaire et d'associer des valeurs à des noms de variables après ses clés. Quelque chose comme

params = {'a':1,'b':2}
a,b = params.values()

Mais comme les dictionnaires ne sont pas ordonnés, il n'y a aucune garantie que params.values() retournera des valeurs de l'ordre de (a, b). Il y a un bon moyen de faire ça ?

286voto

Zachary822 Points 2255
from operator import itemgetter

params = {'a': 1, 'b': 2}

a, b = itemgetter('a', 'b')(params)

Au lieu de fonctions lambda élaborées ou de la compréhension du dictionnaire, peut aussi bien utiliser une bibliothèque intégrée.

45voto

Danon Points 1064

Pourquoi personne n'a publié l'approche la plus simple ?

params = {'a':1,'b':2}

a, b = params['a'], params['b']

40voto

ShawnFumo Points 445

Une façon de le faire avec moins de répétition que la suggestion de Jochen est avec une fonction d'aide. Cela donne la flexibilité de lister vos noms de variables dans n'importe quel ordre et de ne déstructurer qu'un sous-ensemble de ce qui est dans la dictée :

pluck = lambda dict, *args: (dict[arg] for arg in args)

things = {'blah': 'bleh', 'foo': 'bar'}
foo, blah = pluck(things, 'foo', 'blah')

Aussi, au lieu de joaquin' s OrderedDict vous pourriez trier les clés et obtenir les valeurs. Les seules captures sont que vous devez spécifier vos noms de variables dans l'ordre alphabétique et tout déstructurer dans la dictée :

sorted_vals = lambda dict: (t[1] for t in sorted(dict.items()))

things = {'foo': 'bar', 'blah': 'bleh'}
blah, foo = sorted_vals(things)

28voto

Sylvain Leroux Points 9401

Python ne peut "déstructurer" que des séquences, pas des dictionnaires. Donc, pour écrire ce que vous voulez, vous devrez mapper les entrées nécessaires à une séquence correcte. En ce qui me concerne, le match le plus proche que j'ai pu trouver est le (pas très sexy) :

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

Cela fonctionne aussi avec les générateurs :

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

En voici un exemple complet :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X