2017-09-28 15 views
-1

外部ファイルからネストされた辞書をインポートしていて、最も深いレベルの値にアクセスしようとしています。私は次のエラーを取得するforループを使用しようとすると、しかし、:Python 3.5でネストされた辞書にアクセスする

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

を私は(ファイルemojiFlags.pyから)輸入てる辞書には、次のようになります。

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

などなど

ここで

私が働いているコードの抜粋です:

from emojiFlags import flagSet 

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

は、私はかなりCよ私はこれまで何度も他の辞書でこれをやったことがあります(そして何の問題もありませんでした)、私はこの時点で何かが分からないと思っています。

奇妙なことに、私がprint(flagSet)なら、私の帰りはemojiFlagSet(キー)であり、その値(辞書)ではありません。しかし、もし私がprint(flagSet['emojiFlagSet'])であれば、戻り値は入れ子になっている辞書の値全体であるはずです。私が代わりに

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

は、私はちょうどprint(flagSet)の文と同じように、国名のすべてを得るが、しようとすると、私はキーのみではなく、そのネストされた辞書の値を取得します。

私の最終目標は、各国の辞書内の'unicode'キーの値を単純に戻すことです。だから、私は最初の国には、例えば、

U+1F1E6 U+1F1E9 

が表示されます。すべての

奇妙な、私は簡単なテストとして

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

をすれば、私は私が探している正確に何を得ます。 forループでどこが間違っているかについての提案はありますか?

+0

'.values()'を繰り返しますか? 'print(flagSet ['emojiFlagSet'] [country] ['unicode'])'? – jonrsharpe

+0

@jonrsharpeさんがあなたのコメントを見ました...フィードバックに感謝します!これは(あなたの2番目の提案)は私が以前に使用したことだとちょうどそれを忘れているようだ –

答えて

1

辞書自体を反復処理しています。その辞書にはというキーが含まれています。 flagSet['emojiFlagSet']辞書では、これらのキーは文字列です('Andorra'および'Afghanistan'など)。

代わりに値が必要でしたが、これも辞書である値です。 dict.values()をループ:あなたが他のモジュールからのデータ構造を輸入しているという事実は、このすべてとは関係ありませんことを

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

注意。

+0

面白い。以前はdict.values()で作業していませんでした(Pythonで作業してからしばらく時間がかかりました)。私は 'print'文を' print(flagSet ['emojiFlagSet'] [country] ['unicode']) 'に変更することで問題を解決しました。読みやすさの問題以外に、代わりに '.values()'を使うパフォーマンス上の理由はありますか? –

+0

@BenjaminAlanWallsten:まあ、はい、ループで毎回2回追加のアイテムの参照を行うのは、少し遅いでしょう。辞書はキーと値のペアです。必要なものがすべて値であれば、値をループするだけです。 Python固有のものではありません。 C#とC++とJavaは辞書を提供しています(しかし、JavaとC++はそれらをマップと呼んでいます)。 –

+0

これは理にかなっています(そして初期の自己教育の危険の1つですが、それは後天的には明らかです)。 '.values()'それはそうです!とても有難い! –

関連する問題