0

2 次元の連想配列 (辞書) があります。for ループを使用して最初の次元を反復し、各反復で 2 番目の次元の辞書を抽出したいと思います。

例えば:

#!/usr/bin/python
doubleDict = dict()
doubleDict['one'] = dict()
doubleDict['one']['type'] = 'animal'
doubleDict['one']['name'] = 'joe'
doubleDict['one']['species'] = 'monkey'
doubleDict['two'] = dict()
doubleDict['two']['type'] = 'plant'
doubleDict['two']['name'] = 'moe'
doubleDict['two']['species'] = 'oak'

for thing in doubleDict:
        print thing
        print thing['type']
        print thing['name']
        print thing['species']

私の望む出力:

{'type': 'plant', 'name': 'moe', 'species': 'oak'}
plant
moe
oak

私の実際の出力:

two
Traceback (most recent call last):
  File "./test.py", line 16, in <module>
    print thing['type']
TypeError: string indices must be integers, not str

私は何が欠けていますか?

PS私はできることを知ってfor k,v in doubleDictますが、長いif k == 'type': ... elif k == 'name': ...ステートメントを実行する必要がないようにしています。thing['type']直接電話できるようにしたいです。

4

5 に答える 5

4

ディクショナリを反復処理するときは、値ではなくキーを反復処理します。ネストされた値を取得するには、次のことを行う必要があります。

for thing in doubleDict:
    print doubleDict[thing]
    print doubleDict[thing]['type']
    print doubleDict[thing]['name']
    print doubleDict[thing]['species']
于 2013-09-23T01:07:25.510 に答える
3

s のfor ループはdict、値ではなくキーを反復処理します。

値を反復処理するには、次のようにします。

for thing in doubleDict.itervalues():
        print thing
        print thing['type']
        print thing['name']
        print thing['species']

まったく同じコードを使用しました.itervalues()が、最後に「値を繰り返し処理したい」という意味を追加しました。

于 2013-09-23T01:08:27.663 に答える
2

ネストされた結果を取得する一般的な方法:

for thing in doubleDict.values():
  print(thing)
  for vals in thing.values():
    print(vals)

また

for thing in doubleDict.values():
  print(thing)
  print('\n'.join(thing.values()))
于 2013-09-23T01:11:06.643 に答える
0

@Haidroの回答を使用できますが、二重ループでより一般的にすることができます:

for key1 in doubleDict:
    print(doubleDict[key1])
    for key2 in doubleDict[key1]:
        print(doubleDict[key1][key2])


{'type': 'plant', 'name': 'moe', 'species': 'oak'}
plant
moe
oak
{'type': 'animal', 'name': 'joe', 'species': 'monkey'}
animal
joe
monkey
于 2013-09-23T05:48:47.373 に答える