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)