Peu de gens semblent, malgré les nombreuses réponses à cette question, avoir souligné que les dictionnaires sont des mappages non ordonnés, et donc (jusqu'à la bénédiction de l'ordre d'insertion avec Python 3.7) l'idée de la "première" entrée dans un dictionnaire a littéralement fait pas de sens. Et même un OrderedDict
ne peut être consulté que par index numérique en utilisant des laideurs telles que mydict[mydict.keys()[0]]
(Python 2 uniquement, car en Python 3 keys()
est un itérateur non indexable.)
À partir de 3.7 et en pratique dans 3,6 également - le nouveau comportement a été introduit à l'époque, mais pas inclus dans la spécification du langage jusqu'à 3.7 - itération sur les clés, les valeurs ou les éléments d'un dict (et, je crois, un set également) donnera les objets les moins récemment insérés en premier. Il n'y a toujours pas de moyen simple d'y accéder par index numérique d'insertion.
Quant à la question de la sélection et du «formatage» des éléments, si vous connaissez la clé que vous souhaitez récupérer dans le dictionnaire, vous utiliserez normalement la clé comme indice pour la récupérer ( my_var = mydict['Apple']
).
Si vous voulez vraiment pouvoir indexer les éléments par numéro d'entrée (en ignorant le fait que le numéro d'une entrée particulière changera au fur et à mesure des insertions), alors la structure appropriée serait probablement une liste de tuples à deux éléments. Au lieu de
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
vous pourriez utiliser:
mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]
Sous ce régime, la première entrée est mylist[0]
sous forme de liste endex classique, et sa valeur est ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Vous pouvez parcourir toute la liste comme suit:
for (key, value) in mylist: # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])
mais si vous savez que vous recherchez la clé "Apple", pourquoi n'utiliseriez-vous pas simplement un dict à la place?
Vous pouvez introduire un niveau supplémentaire d'indirection en mettant en cache la liste des clés, mais la complexité de maintenir deux structures de données en synchronisation ajouterait inévitablement à la complexité de votre code.