3
respostas

Não entendi o append

Eu não entendi ainda como esse trecho sabe que o valor da chave item, price e description sabe que corresponde ao restaurante correto.

dados_restaurante[nome_do_restaurante].append({
'item': item['Item'],
'price': item['price'],
'description': item['description']
})

==================== ABAIXO CÓDIGO ORIGINAL====================================
import requests
import json

url = 'https://guilhermeonrails.github.io/api-restaurantes/restaurantes.json'

response = requests.get(url)
print(response)

if response.status_code == 200:
dados_json = response.json()
dados_restaurante = {}
for item in dados_json:
nome_do_restaurante = item['Company']
if nome_do_restaurante not in dados_restaurante:
dados_restaurante[nome_do_restaurante] = []

    dados_restaurante[nome_do_restaurante].append({
        'item': item['Item'],
        'price': item['price'],
        'description': item['description']
    })
    
    

else:
print(f'O erro foi {response.status_code}')

for nome_do_restaurante, dados in dados_restaurante.items():
nome_do_arquivo = f'{nome_do_restaurante}.json'
with open(nome_do_arquivo, 'w') as arquivo_restaurante:
json.dump(dados, arquivo_restaurante, indent=4)

3 respostas

Olá Alisson.
Vamos esclarecer exatamente por que esse trecho…

dados_restaurante[nome_do_restaurante].append({
    'item': item['Item'],
    'price': item['price'],
    'description': item['description']
})

…sabe que item, price e description pertencem ao restaurante correto.
O dados_json é uma lista de dicionários carregada da API:

dados_json = response.json()

Cada elemento de dados_json é algo desse tipo:

{
  "Company": "McDonalds",
  "Item": "Big Mac",
  "price": 5.99,
  "description": "Hamburger clássico"
}

Ou:

{
  "Company": "Subway",
  "Item": "Italiano",
  "price": 4.99,
  "description": "Sanduíche"
}

Ou seja, cada item já vem com o restaurante dentro dele, no campo "Company".
Você faz:

for item in dados_json:
    nome_do_restaurante = item['Company']

Assim, em cada iteração:

  • Se o item é do McDonalds → nome_do_restaurante = "McDonalds"
  • Se é do Subway → nome_do_restaurante = "Subway"

O dicionário dados_restaurante cria a “caixa” de cada restaurante

if nome_do_restaurante not in dados_restaurante:
    dados_restaurante[nome_do_restaurante] = []

Isso garante que:

  • dados_restaurante["McDonalds"] será uma lista com os itens do McDonalds
  • dados_restaurante["Subway"] será outra lista com os itens do Subway

Agora, ao dar o .append(), você está dentro da caixa certa
Quando o loop está processando um item que pertence ao restaurante X, você faz:

dados_restaurante[nome_do_restaurante].append({...})

Ou seja, se nome_do_restaurante for "McDonalds":

dados_restaurante["McDonalds"].append({
    'item': item['Item'],
    'price': item['price'],
    'description': item['description']
})

Se for "Subway":

dados_restaurante["Subway"].append(...)

Então quem decide o restaurante correto é o próprio valor item['Company'] que veio da API.

Resumo simples:
O trecho sabe para qual restaurante mandar os dados porque:

  1. Cada registro tem um campo "Company".
  2. O loop lê esse campo e o guarda em nome_do_restaurante.
  3. O dicionário dados_restaurante usa esse nome como chave.
  4. O append() adiciona o item exatamente na lista desse restaurante.

Não existe mágica.
O próprio JSON diz a qual restaurante cada item pertence.
Se quer ver o que acontece passo a passo é só ativar a ferramenta de debug.
Qualquer duvida comente ai.
Bons estudos.

Você quer dizer que nesse código:

'dados_restaurante[nome_do_restaurante].append({
'item': item['Item'],
'price': item['price'],
'description': item['description']
})

Pelo fato do append ja estar na caixa certa, ele procura na lista item, os itens de acordo com a caixa?

Por isso quando coloco a variavel item, ele sabe oque buscar?

Olá amigo.
A melhor maneira de entender o fluxo do que está acontecendo é utilizar a ferramenta de debug da sua IDE.
Assim voce ve o que está acontecendo etapa a etapa desde valores das variaveis e onde estão buscando a informação.
O fluxo funciona assim: dados_restaurante provavelmente é um dicionário.
Cada chave é o nome de um restaurante, e o valor associado a essa chave é uma lista.
Quando você faz dados_restaurante[nome_do_restaurante].append(...), você está acessando essa lista específica e adicionando um novo dicionário dentro dela.
O append não procura nada dentro de item. Ele apenas pega o que você está passando para ele e coloca no final da lista correspondente à chave nome_do_restaurante.
O motivo pelo qual item['Item'], item['price'] e item['description'] funcionam é que você está usando a variável item, que já contém um dicionário com essas chaves.
Ou seja, o Python não descobre sozinho o que buscar; você já está dizendo exatamente onde buscar: dentro do dicionário item.
Resumindo, o fluxo é: acessar a lista que pertence ao restaurante certo, montar um novo dicionário usando os valores dentro de item, e anexar esse novo dicionário à lista com append.
Espero ter ajudado.
Avise alguma duvida.
Bons estudos.