Imaginez que vous ayez une structures de données ainsi initialisée :
from random import choice, randint
tags = ('personne', 'animal', 'objet')
depart = {}
depart = {'%s_%s' % (choice(tags), randint(0, 10)): None for x in range(10)}
Cela donne quelque chose comme ça :
{u'personne_6': None,
u'personne_5': None,
u'objet_9': None,
u'objet_6': None,
u'objet_4': None,
u'personne_8': None,
u'objet_2': None,
u'objet_0': None,
u'animal_8': None}
On voit que les clés ont ici une valeur sémantique importante : elles sont porteuses de sens.
Si vous voulez la liste des nombres utilisés, il va vous falloir changer votre structure de données : en avoir plusieurs séparées, probablement. Ou alors faire de la manipulation de chaîne à base de split()
et de casting.
Par contre, si vous utilisez un tuple comme clé, vous avez le même format pour votre dictionnaire depart
, avec les mêmes possibilités, mais en plus un accès aux clés plus complet.
Déjà le code de génération est plus simple :
depart = {(choice(tags), randint(0, 10)): None for x in range(10)}
Ce qui donne :
{(u'animal', 2): None,
(u'personne', 5): None,
(u'personne', 4): None,
(u'objet', 6): None,
(u'objet', 10): None,
(u'animal', 7): None,
(u'animal', 1): None,
(u'animal', 10): None,
(u'personne', 8): None}
Mais en prime, on peut faire ça :
for (tag, number), value in depart.items():
print tag, number, value
## animal 2 None
## personne 5 None
## personne 4 None
## objet 6 None
## objet 10 None
## animal 7 None
## animal 1 None
## animal 10 None
## personne 8 None
Bref, quand vos clés ont une valeur sémantique importante, pensez à utiliser des tuples, voir carrément, un namedtuple, qui est une structure de données trop souvent ignorée alors qu’elle est très puissante, et peut remplacer bien des classes conteneurs.
]]>