遍历字典中的字典,字典对象变成字符串?

时间:2018-07-06 20:41:25

标签: python python-3.x

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循环会将字典转换为字符串吗?

2 个答案:

答案 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()遍历项目。