1
resposta

Dúvida chave-valor na iteração

Considere os dicionários dados e dados2 a seguir:

dados = {
    'Crossfox': {'km': 35000, 'ano': 2005}, 
    'DS5': {'km': 17000, 'ano': 2015}, 
    'Fusca': {'km': 130000, 'ano': 1979}, 
    'Jetta': {'km': 56000, 'ano': 2011}, 
    'Passat': {'km': 62000, 'ano': 1999}
}

dados2 = {'nome': 'Fulano', 'idade': 20}

Observe a iteração do "for" em ambos os datasets

for d in dados.items():
  print(d)

('Crossfox', {'km': 35000, 'ano': 2005})
('DS5', {'km': 17000, 'ano': 2015})
('Fusca', {'km': 130000, 'ano': 1979})
('Jetta', {'km': 56000, 'ano': 2011})
('Passat', {'km': 62000, 'ano': 1999})

Pergunta 1: O código acima retorna uma tupla chave-valor para cada item do dicionario? No caso. a chave é o modelo do carro(Crossfox, DSS etc), e o valor é um outro dicionário ({'km': 35000, 'ano': 2005})?

for d in dados.items():
  print(d[1]['km'])

 35000
17000
130000
56000
62000

No código acima, no print, eu estou pegando o índice 1 do dicionário, por exemplo, o dicionário {'km': 35000, 'ano': 2005} e, dentro desse dicionário, eu estou sendo mais especifico, indicando que quero pegar a chave 'km'. Logo, ele exibe apenas a quilometragem de cada dicionario, que é o valor de cada chave 'km'. É isso?

for d2 in dados2.items():
  print(d2)

  ('nome', 'Fulano')
('idade', 20)  

No código acima, ele exibe o par chave-valor de dados2. Por que o codigo abaixo

for d2 in dados2.items():
  print(d2[1])
  Fulano
  20

exibe os valores das chaves nome e idade (ou seja, Fulano 20)? Quando eu passo d2[1], ele não deveria pegar apenas a idade, que é a segunda chave do dicionário dados2 = {'nome': 'Fulano', 'idade': 20}

Grato desde já.

1 resposta

Olá, Rogério. Tudo bem?

Vamos lá responder suas dúvidas:

1) Exato, o print() exibe uma tupla. Ao serem iterados item por item, acabamos vendo tuplas como retorno. Podemos ver isso utilizamos a função type():

for d in dados.items():
  print(type(d))

Saída:

<class 'tuple'>

<class 'tuple'>

<class 'tuple'>

<class 'tuple'>

<class 'tuple'>

Como estamos recebendo uma tupla contendo dois elementos como retorno, podemos iterar sobre estes dois elementos, que agora irei chamar de chave e valor, ao invés de utilizar apenas um, que nesse caso era o d. Com isso, vamos ver o tipo de dado de cada um desses elementos, dessa forma:

for chave, valor in dados.items():
  print(type(chave), type(valor))

Saída:

<class 'str'> <class 'dict'>

<class 'str'> <class 'dict'>

<class 'str'> <class 'dict'>

<class 'str'> <class 'dict'>

<class 'str'> <class 'dict'>

Como podemos ver, na tupla temos uma string, o modelo do carro, e um dicionário, com o km e o ano.

2) Exatamente! Para que você possa averiguar isso, bastar fazer o print sem especificar o km, dessa forma, você verá o que você está acessando:

for d in dados.items():
  print(d[1])

Saída:

{'km': 35000, 'ano': 2005}

{'km': 17000, 'ano': 2015}

{'km': 130000, 'ano': 1979}

{'km': 56000, 'ano': 2011}

{'km': 62000, 'ano': 1999}

Agora temos certeza que você está acessando especificamente os valores da chave km deste dicionário.

3) Para ajudar a entender o que significa esse d2[1], vamos ver o que tem em cada índice:

for d2 in dados2.items():
  print(f'd2: {d2}     d2[0]: {d2[0]}      d2[1]: {d2[1]}')

Saída:

d2: ('nome', 'Fulano')          d2[0]: nome            d2[1]: Fulano

d2: ('idade', 20)             d2[0]: idade              d2[1]: 20

Como podemos ver, o que temos no índice 1 de cada elemento é Fulano e 20, respectivamente. A idade é a segunda chave do dicionário, porém, estamos percorrendo cada par chave: valor. Dessa forma, vemos primeiro o par nome: Fulano, e depois o par idade: 20. E em cada vez que olhamos um par, estamos pegando apenas o valor, o qual acessamos pelo índice 1.

 

Espero ter ajudado, Rogério. Se tiver mais alguma dúvida, estou à disposição. Bons estudos =)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!