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循环会将字典转换为字符串吗?
答案 0 :(得分:2)
如果您遍历字典,则遍历键。因此,这意味着在第一个循环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)
答案 1 :(得分:1)
当您使用for
遍历字典时,您不是遍历项目,而是遍历键('a', 'b'
)。这些只是字符串,什么都没有。因此,您必须像测试2一样进行操作。您还可以使用test.items()
遍历项目。