Site original : Sam & Max: Python, Django, Git et du cul
On peut utiliser n’importe quel objet hashable comme clé de dictionnaire en Python, pas uniquement des strings. Donc des entiers bien entendu, mais également, et c’est rarement utilisé, des tuples.
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.