Python 访问嵌套字典中的数据时出错
我有以下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
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,则会考虑嵌套文档,但不确定是否需要此选项