134 votes

Accès aux éléments d'un dictionnaire Python par index

Considérons un dict comme

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

Comment accéder, par exemple, à un élément particulier de ce dictionnaire ? Par exemple, je voudrais imprimer le premier élément après un certain formatage, le premier élément de Apple qui dans notre cas est 'American' seulement ?

Informations complémentaires La structure de données ci-dessus a été créée en analysant un fichier d'entrée dans une fonction python. Une fois créée, elle reste cependant inchangée pour cette exécution.

J'utilise cette structure de données dans ma fonction.

Ainsi, si le fichier change, lors de la prochaine exécution de l'application, le contenu du fichier sera différent et, par conséquent, le contenu de cette structure de données sera différent, mais le format sera le même. Vous voyez donc que dans ma fonction, je ne sais pas si le premier élément de Apple est "American" ou quoi que ce soit d'autre, et je ne peux donc pas utiliser directement "American" comme clé.

139voto

Morten Kristensen Points 4071

Étant donné qu'il s'agit d'un dictionnaire, vous y accédez en utilisant les clés. Pour obtenir le dictionnaire stocké sous "Apple", procédez comme suit :

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

Et obtenir combien d'entre eux sont américains (16), faire comme ça :

>>> mydict["Apple"]["American"]
'16'

25voto

JoshAdel Points 15911

Si la question est de savoir si je sais que je dispose d'une dictée qui contient "Apple" comme fruit et "American" comme type de pomme, j'utiliserai la dictée :

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }

print myDict['Apple']['American']

comme d'autres l'ont suggéré. Si, au contraire, la question est de savoir si "Apple" en tant que fruit et "American" en tant que type de "Apple" existent lorsque vous lisez un fichier arbitraire dans votre structure de données dict of dict, vous pourriez faire quelque chose comme :

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

ou mieux encore, pour ne pas itérer inutilement sur l'ensemble des dicts si vous savez que seul Apple possède le type American :

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

Dans tous ces cas, l'ordre dans lequel les dictionnaires stockent les entrées n'a pas d'importance. Si vous êtes vraiment préoccupé par l'ordre, vous pouvez envisager d'utiliser un fichier OrderedDict :

http://docs.python.org/dev/library/collections.html#collections.OrderedDict

21voto

Zeinab Abbasi Points 413

Comme je l'ai vu dans votre description, vous savez juste que votre parseur vous donnera un dictionnaire dont les valeurs sont également des dictionnaires comme ceci :

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

Vous devez donc itérer sur votre dictionnaire parent. Si vous voulez imprimer ou accéder à toutes les premières clés du dictionnaire dans sampleDict.values() vous pouvez utiliser quelque chose comme ceci :

for key, value in sampleDict.items():
    print value.keys()[0]

Si vous voulez seulement accéder à la première clé du premier élément dans sampleDict.values() Cela peut s'avérer utile :

print sampleDict.values()[0].keys()[0]

Si l'on reprend l'exemple que vous avez donné dans la question, je veux dire.. :

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

La sortie du premier code est la suivante :

American
Indian

Le résultat du deuxième code est le suivant :

American

EDIT 1 :

Les exemples de code ci-dessus ne fonctionnent pas pour les versions 3 et supérieures de Python ; en effet, à partir de la version 3, Python a modifié le type de sortie des méthodes. keys et values de list a dict_values . Type dict_values n'accepte pas l'indexation, mais il est itérable. Vous devez donc modifier les codes ci-dessus comme suit :

Première :

for key, value in sampleDict.items():
    print(list(value.keys())[0])

Deuxièmement :

print(list(list(sampleDict.values())[0].keys())[0])

10voto

Flavian Hautbois Points 2572

En prime, j'aimerais vous proposer une solution différente à votre problème. Vous semblez avoir affaire à des dictionnaires imbriqués, ce qui est généralement fastidieux, en particulier lorsque vous devez vérifier l'existence d'une clé intérieure.

Il y a quelques bibliothèques intéressantes à ce sujet sur pypi, en voici une recherche rapide pour vous.

Dans votre cas particulier, dict_digger semble adapté.

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

10voto

Jamie Marshall Points 434

Je sais que cette question date d'il y a 8 ans, mais personne ne semble l'avoir lue et y avoir répondu.

Vous pouvez appeler .values() sur un dict pour obtenir une liste des dicts internes et ainsi y accéder par index.

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']

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