Python 访问嵌套字典中的数据时出错

Python 访问嵌套字典中的数据时出错,python,arrays,python-3.x,Python,Arrays,Python 3.x,我有以下Python脚本: lista_contatos = { "1": {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"}, "2": {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"} } n = len(lista_contatos) i = int i = 1

我有以下Python脚本:

lista_contatos = {
    "1": {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
    "2": {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}

}
n = len(lista_contatos)
i = int
i = 1
print(n)

while i <= n:
    print(i)
    print(lista_contatos[i]['nome'])
    print(lista_contatos[i]['cel'])
    i = i + 1
lista\u contatos={
“1”:{“nome”:“Paul”,“cel”:“+9999999”,“cidade”:“SP”,“id_cidade”:“449139”},
“2”:{“nome”:“Junior”,“cel”:“+9999999”,“cidade”:“SP”,“id_cidade”:“449139”}
}
n=len(列表(续)
i=int
i=1
打印(n)

而我这个数据结构没有多大意义。如果您的键只是序列号,并且您计划迭代元素,那么字典是错误的工具。(或者,如果需要不变性的话)是为了您的预期目的而发明的,而遍历连续的内存块比散列更高效,在语义上也更合适

此外,
for
循环是遍历列表的正确构造,而不是
while
循环,当停止条件不是计数器时,这更合适

lista_contatos = [
    {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
    {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}
]

for elem in lista_contatos:
    print(elem['nome'], elem['cel'])
至于您最初的问题,由于整数是dict键的非法值,
{“1”:“foo”}[1]
生成您的
KeyError
。您需要将
i
转换为字符串

lista_contatos[str(i)]['cel']
#              ^^^^^^
这应该感觉像是在跳圈,是一个危险信号,表明数据结构的选择出了问题

这并不是说在字典上循环是不好的,但是它的工作方式是通过使用
some dict.items()
some dict.keys()
some dict.values()
将字典转换成一个函数。如果您使用的是Python<3.6,则不能保证排序(使用
collections.orderedict
)。像
i
这样的计数器在任何情况下都不会进入图片

i=int
的目的可能是声明一个类型。但该变量将
int
(用于强制转换的内置类型)别名为变量
i
。您不需要像这样在Python中声明类型;只要写
i=1
,Python就会自动知道它是一个整数:

>>> i = 1      
>>> type(i)    
<class 'int'>  
>>i=1
>>>第(i)类


什么时候真正使用字典?答案是,只要您需要在键值对的基础上快速查找相关项,其中键是唯一的、可散列的标识符,而不是
0..n
中的序列整数。想象一个产品清单,每个产品都有一些任意的UPC或SKU编号作为键,其余的产品数据作为属性的dict。

基本上你需要进行DFS打印

lista_contatos = {"1": {"nome": "Paul", "cel": "+9999999999", "cidade": "SP", "id_cidade": "449139"},
                "2": {"nome": "Junior", "cel": "+999999999", "cidade": "SP", "id_cidade": "449139"}}

def printDict(d):
    for k, v in d.items():
        print('key: ', k)
        if type(v) is dict:
            printDict(v)
        else:
            print('value: ', v)
printDict(lista_contatos)
结果:

key:  2
key:  id_cidade
value:  449139
key:  cidade
value:  SP
key:  nome
value:  Junior
key:  cel
value:  +999999999
key:  1
key:  id_cidade
value:  449139
key:  cidade
value:  SP
key:  nome
value:  Paul
key:  cel
value:  +9999999999

你知道这是一本字典吗?您的
i
值是整数,因此您不应该期望它与字符串键匹配。@ggorlen在更改“1”:[“nome”:“Paul”,“cel”:“+9999999”,“cidade”:“SP”,“id_cidade”:“449139”],我得到语法错误:对于键,lista_contatos中的值,语法无效。items():
使用lista_contatos[str(i)]['nome']若要访问元素或将键设置为整数“1”不等于1,则会考虑嵌套文档,但不确定是否需要此选项