web-dev-qa-db-fra.com

Accès aux éléments du dictionnaire Python par index

Considérez 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 avoir formaté le premier élément de Apple lequel, dans notre cas, est uniquement "américain"?

Informations supplé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éé, il reste le même pour cette exécution.

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

Donc, si le fichier change, la prochaine fois que cette application sera exécutée, 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, dans ma fonction, je ne sais pas que le premier élément de Apple est "américain" ou autre chose, je ne peux donc pas utiliser directement "américain" comme clé.

98
alessandra

Étant donné que c'est un dictionnaire, vous y accédez en utilisant les touches. Pour que le dictionnaire soit stocké sous "Apple", procédez comme suit:

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

Et comme combien d’entre eux sont américains (16), faites comme ceci:

>>> mydict["Apple"]["American"]
'16'
109
Morten Kristensen

Si la question est, si je sais que j'ai un dicton de dicts qui contient "Apple" en tant que fruit et "American" en tant que type de Apple, j'utiliserais:

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, vous vous posez des questions, vous ne savez pas si "Apple" en tant que fruit et "américain" en tant que type de "Apple" existent lorsque vous lisez un fichier arbitraire dans votre structure de données dict of dict, vous pouvez effectuer les opérations suivantes:

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

ou mieux encore pour ne pas parcourir inutilement la totalité du dictionnaire de dict si vous savez que seul Apple a le type américain:

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 importe peu. Si vous êtes vraiment préoccupé par la commande, vous pouvez envisager d'utiliser un OrderedDict:

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

23
JoshAdel

Comme j'ai remarqué votre description, vous savez juste que votre analyseur va vous donner un dictionnaire dont les valeurs sont aussi dictionnaire comme ceci:

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

Vous devez donc parcourir votre dictionnaire parent. Si vous souhaitez imprimer ou accéder à toutes les premières clés de dictionnaire de la liste sampleDict.values(), vous pouvez utiliser quelque chose comme ceci:

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

Si vous voulez simplement accéder à la première clé du premier élément de sampleDict.values(), cela peut être utile:

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

Si vous utilisez 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 pour le premier code est:

American
Indian

Et la sortie pour le second code est:

American
18
Zeinab Abbasimazar

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

Il y a quelques bibliothèques intéressantes à ce sujet sur pypi, voici un 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
9
Flavian Hautbois

Vous pouvez utiliser dict['Apple'].keys()[0] pour obtenir la première clé du dictionnaire Apple, mais rien ne garantit qu'il s'agira de American. L'ordre des clés dans un dictionnaire peut changer en fonction du contenu du dictionnaire et de l'ordre dans lequel les clés ont été ajoutées.

8
Gabe

Vous ne pouvez pas compter sur l'ordre des dictionnaires. Mais vous pouvez essayer ceci:

dict['Apple'].items()[0][0]

Si vous voulez que l'ordre soit préservé, vous pouvez utiliser ceci: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api

4
correndo

Je sais que cela fait 8 ans, mais personne ne semble avoir lu et répondu à la question.

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

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

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

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

Exemple simple pour comprendre comment accéder aux éléments du dictionnaire: -

Créer un dictionnaire

d = {'dog' : 'bark', 'cat' : 'meow' } 
print(d.get('cat'))
print(d.get('lion'))
print(d.get('lion', 'Not in the dictionary'))
print(d.get('lion', 'NA'))
print(d.get('dog', 'NA'))

En savoir plus sur dictionnaires Python et apprendre de manière interactive ici ...

2
Manish Methani

Peu de gens semblent, malgré les nombreuses réponses à cette question, avoir fait remarquer que les dictionnaires sont des mappages non ordonnés, et ainsi (jusqu'à la bénédiction de l'ordre d'insertion avec Python 3.7) l'idée du "premier" l'entrée dans un dictionnaire n'avait littéralement aucun sens. Et même un OrderedDict est accessible uniquement par index numérique en utilisant des laideurs telles que mydict[mydict.keys()[0]] (Python 2 uniquement, car dans Python 3 keys() est un itérateur non subscriptable .)

à partir de la version 3.7 et dans la pratique également en 3.6 - le nouveau comportement a été introduit à ce moment-là, mais n'a été inclus dans la spécification du langage qu'en 3.7 - itération sur les clés, les valeurs ou les éléments d'un dict (et, je crois, un ensemble également) produira d’abord les objets les moins récemment insérés. Il n’existe toujours pas de moyen simple d’y accéder par index numérique d’insertion.

En ce qui concerne 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 le 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 donnée changera au fur et à mesure que des insertions sont effectuées), la structure appropriée serait probablement une liste de n-uplets à 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 classique de liste-endexée et sa valeur est ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}). Vous pouvez parcourir la liste complète 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 ne pas utiliser un dict à la place?

Vous pouvez introduire un niveau supplémentaire d'indirection en mettant en cache la liste de clés, mais la complexité de la synchronisation de deux structures de données ne ferait qu'accroître inévitablement la complexité de votre code.

0
holdenweb