2017-09-28 1 views
-1

J'importe un dictionnaire imbriqué à partir d'un fichier externe et j'essaie d'accéder aux valeurs au niveau le plus profond; Cependant, lorsque je tente d'utiliser des boucles for je reçois l'erreur suivante:Accès au dictionnaire imbriqué dans Python 3.5

print(country['unicode']) 
TypeError: string indices must be integers 

Le dictionnaire que je importe (à partir d'un fichier emojiFlags.py) ressemble à ceci:

flagSet = {'emojiFlagSet': {'Andorra': {'emoji': '', 'unicode': 
'U+1F1E6 U+1F1E9'}, 'Afghanistan': {'emoji': '', 'unicode': 'U+1F1E6 
U+1F1EB'}, ... }} 

etc., etc.

Voici les extraits de code avec lesquels je travaille:

from emojiFlags import flagSet 

# Get country emoji data 
for country in flagSet['emojiFlagSet']: 
    print(country['unicode']) 

Je suis assez c J'ai déjà fait quelque chose comme ça sur un certain nombre d'autres dictionnaires (et je n'ai eu aucun problème), et je me demande s'il y a quelque chose d'évident qui me manque à ce stade.

Bizarrement, si je print(flagSet), mon retour est emojiFlagSet (la clé), pas sa valeur (un dictionnaire); cependant, si je print(flagSet['emojiFlagSet']) le retour est la valeur du dictionnaire imbriqué entier comme il se doit. Si je tente à la place

for country in flagSet['emojiFlagSet']: 
    print(country) 

Je reçois tous les noms de pays, mais, tout comme avec la déclaration print(flagSet), je ne reçois que les clés et non leurs valeurs dictionnaire imbriquées.

Mon but final est de simplement retourner la valeur des clés 'unicode' dans le dictionnaire de chaque pays. Donc, je m'attendrais à voir

U+1F1E6 U+1F1E9 

pour le premier pays, par exemple.

Strangest de tous, si je fais un test simple

print(flagSet['emojiFlagSet']['Andorra']['unicode']) 

, j'obtenir exactement ce que je cherche. Des suggestions sur où je vais mal dans ma boucle for?

+0

Effectue l'itération sur '.values ​​()'? 'print (flagSet ['emojiFlagSet'] [pays] ['unicode'])'? – jonrsharpe

+0

@jonrsharpe juste vu votre commentaire ... merci pour les commentaires! Il semble que ceci (votre deuxième suggestion) est ce que j'ai utilisé avant et juste oublié –

Répondre

1

Vous parcourez le dictionnaire lui-même, ce qui donne les clés pour ce dictionnaire. Dans votre dictionnaire flagSet['emojiFlagSet'], ces clés sont des chaînes (telles que 'Andorra' et 'Afghanistan').

Vous vouliez plutôt les valeurs, ce sont les valeurs qui sont aussi des dictionnaires. Boucle sur dict.values():

for country in flagSet['emojiFlagSet'].values(): 
    print(country['unicode']) 

Notez que le fait que vous avez importé la structure de données à partir d'un autre module n'a aucune incidence sur tout cela.

+0

Intéressant. Je n'ai pas travaillé avec dict.values ​​() avant (cela fait un moment que je travaillais avec Python). Je viens de résoudre mon problème en changeant mon instruction 'print' à' print (flagSet ['emojiFlagSet'] [pays] ['unicode']) '. Mis à part les problèmes de lisibilité, y a-t-il une raison de performance pour utiliser '.values ​​()' à la place? –

+0

@BenjaminAlanWallsten: Eh bien, oui, avoir à faire 2 recherches d'objets supplémentaires à chaque fois dans la boucle sera un peu plus lent.Les dictionnaires sont des paires clé-valeur; Si tout ce que vous voulez, ce sont les valeurs, faites simplement une boucle sur les valeurs. Ce n'est pas vraiment spécifique à Python, d'ailleurs; C# et C++ et Java offrent aussi des dictionnaires (mais Java et C++ les appellent des cartes). –

+0

Cela a du sens (et semble tellement évident en rétrospective - l'un des dangers de l'auto-apprentissage au stade précoce, je suppose). '.values ​​()' c'est alors! Très appréciée! –