test = {'a':{'aa':'value','ab':'value'},'b':{'aa':'value','ab':'value'}}

#test 1
for x in test:
    print(x['aa'])

#test 2
for x in test:
    print(test[x]['aa'])


为什么测试1给我TypeError: string indices must be integers但测试2通过?

for循环会将字典转换为字符串吗?

最佳答案

如果迭代字典,则迭代键。因此,这意味着在第一个循环x = 'a'和第二个x = 'b'中(反之亦然,因为字典是无序的)。因此,它只是简单地“忽略”了这些值。用字符串索引一个字符串是没有意义的(好吧,对于'a'['aa']并没有直接的解释,或者至少不是我能想到的,对于大量程序员而言,这是“逻辑上的”)。

尽管这看起来很奇怪,但与以下事实完全一致:例如,成员资格检查也可以在键上进行(如果我们编写'a' in some_dict,则也不会查找值)。

如果要使用这些值,则需要遍历.values(),因此:

for x in test.values():
    print(x['aa'])


但是,如果您使用第二个密码,那么它将起作用,因为x是键(例如'a'),因此test[x]将为您获取相应的值。如果然后进一步处理test[x],则将处理字典的值。

您可以使用.items()同时迭代键和值:

for k, x in test.items():
    # ...
    pass


在第一个迭代中,k将是'a',而x将是{'aa':'value','ab':'value'},在第二个迭代中,k将是'b',而x将是{'aa':'value','ab':'value'}(同样,迭代可以是交换,因为字典是无序的)。

因此,如果您对外键以及与相应子词典的'aa'键关联的值感兴趣,则可以使用:

for k, x in test.items():
    v = x['aa']
    print(k, v)

07-24 09:39
查看更多