0

我有一个二维关联数组(字典)。我想使用 for 循环遍历第一个维度,并在每次迭代时提取第二个维度的字典。

例如:

#!/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

这些都有效......但是看看你的代码,为什么不使用命名元组呢?

从集合导入命名元组

LivingThing = namedtuple('LivingThing', '类型名称物种')

doubledict['one'] = LivingThing(type='animal', name='joe', species='monkey')

doubledict['one'].name doubledict['one']._asdict['name']

于 2013-09-23T15:39:48.297 回答
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 回答