首页 > 解决方案 > KeyError 访问嵌套字典中的数据

问题描述

我有以下 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

我面临的问题是我需要打印每个键的所有数据,然后再进行第二个数组打印。

问题是当我将计数器添加i为打印键时,出现错误。

任何帮助如何解决这个问题?

标签: pythonarrayspython-3.x

解决方案


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

此外,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']
#              ^^^^^^

这应该感觉就像跳过一个铁环,并且是一个危险信号,表明数据结构的选择出了问题。

这并不是说遍历字典不好,但它的工作方式是使用,或将字典转换为视图对象。如果您使用的是 Python < 3.6,则无法保证排序(使用 a )。在任何情况下,计数器都不会进入图片。some_dict.items()some_dict.keys()some_dict.values()collections.OrderedDicti

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

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

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


推荐阅读