Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

VivaPython

[Resolvido] Lista de dicionários

Mensagens Recomendadas

VivaPython

Boa tarde eu tenho uma duvida. Tenho duas listas com dicionarios la dentro como os seguintes:

lista1 = [
   {'Idade': '8',  'Especie': 'Gato',      'Nome do Animal': 'Felix'},
   {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Michelangelo'},
   {'Idade': '12', 'Especie': 'Cao',       'Nome do Animal': 'Rantanplian'},
   {'Idade': '2',  'Especie': 'Peixe',     'Nome do Animal': 'Nemo'},
   {'Idade': '45', 'Especie': 'Tartaruga', 'Nome do Animal': 'Leonardo'},
   {'Idade': '9',  'Especie': 'Cao',       'Nome do Animal': 'Milo'},
   {'Idade': '57', 'Especie': 'Tartaruga', 'Nome do Animal': 'Raphael'},
   {'Idade': '4',  'Especie': 'Peixe',     'Nome do Animal': 'Dory'} ]

lista2 = [
   {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Michelangelo'},
   {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Dory'},
   {'Nome do Dono ': 'Ada', 'Nome do Animal': 'Rantanplan'},
   {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Leonardo'},
   {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Felix'},
   {'Nome do Dono ': 'Ana', 'Nome do Animal': 'Raphael'},
   {'Nome do Dono ': 'Eva', 'Nome do Animal': 'Nemo'} ]

O que pretendo é fazer a média da idade dos animais de cada dono e obter isto :

[{'Ana':'53','Eva':'5','Ada':'12'}]

O que eu ja tinha feito mas que nao me está a dar certo é :

lista_media = []
for nome in lista2:
   for nome_animal in lista1:
       if nome['Nome do Animal'] == nome_animal['Nome do Animal']:
           lista_media.append(nome_animal['Idade'])

Alguem me pode ajudar ? Obrigado

Editado por pwseo
syntax highlight.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

VivaPython,

Mais uma vez, tive que adicionar cor aos teus blocos de código, gostaria que da próxima vez fizesses isso sem intervenção minha: vê aqui como o podes fazer.

Relativamente ao teu problema, por que motivo achas que o teu código está a falhar; consegues explicar o que ele está a fazer para que o resultado seja incorrecto? E o que teria que acontecer para ser o resultado correcto?

E uma outra pergunta: se tivesses que resolver esta questão que te colocaram por partes, como o farias? (podes criar novas funções que te ajudem, ou pedir ajuda para as criares)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

pwseo tens razao , nao sabia como por o codigo assim , obrigado.

Eu sei o que ele está a fazer mal , ele está a ir buscar a idade de todos os animais que estão nas duas listas, o que pretendo é tambem utilizar o key 'Nome do dono' só que nao consegui associar isso á 1º lista.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

E como achas que seria possível fazer essa associação?

Pensa um pouco no assunto e tenta dizer-me como farias passo a passo. Uma dica: imagina que estás sozinho com apenas 3 folhas de papel e um lápis. Cada tabela ocupa uma folha, e a 3ª folha será para dados «temporários». Como farias para resolver o teu problema no papel, sabendo que só podes olhar para 1 linha de 1 tabela de cada vez, e que podes tirar notas (os tais dados temporários) para te ajudar.

Dou-te um exemplo. Se eu quisesse saber o número de donos faria:

nomes = lista vazia
para cada linha em lista2:
   se o campo 'Nome do Dono' não existir em nomes:
       adicionar o campo à lista de nomes
imprimir o número de elementos em nomes

É muito importante que faças este exercício, caso contrário vais apenas aprender a escrever código sem aprender a programar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Peço desculpa mas não estou mesmo a conseguir chegar lá , ja tentei fazer isso num papel ja fiz isso em pyhton e não estou mesmo a conseguir tentei varias coisas e não deu. A minha duvida é mesmo como associar o nome do dono ao animal e depois como ir buscar a idade na 1º lista

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Ok, então tenta responder a estas perguntas:

  • dado o nome do animal, como obter o nome do dono?
  • dado o nome do animal, como obter a idade dele?

Se responderes, tens aí blocos importantes que te permitem resolver o problema. Podes até pensar em criar funções que façam essas duas tarefas, se achares que te simplifica a tarefa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Não estou a conseguir chegar lá , ja tentei com for's com isto antes dos for's:

animais = [i['Nome do Animal'] for i in lista2 if 'Nome do Animal' in i]

Não consigo mesmo conseguir associar uns aos outros , podes ajudar sff ?

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

podes ajudar sff ?

É o que estou a tentar fazer. Essa lista por compreensão que mostraste faz pouco sentido.

Dito isto, tenta primeiro responder às perguntas que te coloquei, pois estás a tentar fazer demasiadas coisas ao mesmo e não há tempo/paciência para erros causados por isso. Começa por completar o seguinte:

# assumimos que lista1 e lista2 são as que já tens acima,
# não precisas de as completar
lista1 = [ ... ]
lista2 = [ ... ]

# Esta função deve devolver o nome do dono de um animal
def dono(nome_animal):
   ...

# Esta função deve devolver a idade de um animal
def idade(nome_animal):
   ...

...e depois podemos passar à fase seguinte.

PS.: no teu código acima, na lista2, o campo 'Nome do Dono' tem um espaço a mais no final. É necessário que o removas para que o código funcione correctamente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Ok tenho isto:

def dono(nome_animal):
   for a in lista2:
    if nome_animal == a['Nome do Animal']:
	    print a['Nome do Dono ']

Ate ja fiz testes e da certo :

>>> dono('Dory')
Eva
>>> dono('Felix')
Eva
>>> dono('Nemo')
Eva
>>> dono('Leonardo')
Ana

def idade(nome_animal):
   for a in lista1:
    if nome_animal == a['Nome do Animal']:
	    print a['Idade']

testes:

>>> idade('Felix')
8
>>> idade('Nemo')
2
>>> idade('Dory')
4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Apenas um reparo:

def dono(nome_animal):
   for a in lista2:
       if nome_animal == a['Nome do Animal']:
           print a['Nome do Dono ']   

Nesse bloco de código, deverias ter return em vez de print. Percebes porquê, certo? (o mesmo pode ser dito da função idade()).

Agora falta uma maneira de saber que donos existem, não é verdade?

Depois, para cada dono que exista, percorres todos os animais e somas as idades dos que pertencem apenas a esse dono. No final divides pelo número de animais que esse dono tem (é a média), e devolves o resultado.

Vai experimentando. Até agora apenas escreveste código que implementa a minha solução, não foste tu a pensar nela, o que é chato para ti.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Pois é que eu consegui fazer isso mas continuo as arranhas de como fazer o que pretendo , não me podes mostrar como farias para ver se percebo ?

É que isto é longa questão , ja fiz coisas antes e ainda tenho coisas para fazer , só que fiquei encalhado numa parte que se calhar é facil mas estou sem perceber

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Pois é que eu consegui fazer isso

O que conseguiste fazer? O código que me mostraste até agora não faz o que pretendes (excepto as funções dono() e idade())

mas continuo as arranhas de como fazer o que pretendo

E o que pretendes concretamente? Eu num post anterior pedi-te explicação passo-a-passo do que precisas de fazer. Respondeste que queres «associar» as duas tabelas, mas nunca disseste como pretendes fazer essa associação. Já pensaste em como poderias fazer essa associação?

não me podes mostrar como farias para ver se percebo ?

Não, pois isso seria resolver o problema por ti, algo que é expressamente proibido pelas regras do fórum (o que é compreensível, pois trata-se de um trabalho de casa).

É que isto é longa questão , ja fiz coisas antes e ainda tenho coisas para fazer , só que fiquei encalhado numa parte que se calhar é facil mas estou sem perceber

Acredito que sim, mas se não começares a perceber como se fazem as coisas, só vai piorar daqui para a frente. No meu último post disse-te que tens que arranjar forma de saber que donos existem, e até te dei textualmente um algoritmo que resolve o teu problema que apenas precisas de traduzir para Python. Não posso ser eu a escrever o código por ti.

Não leves isto a mal, mas se eu respondesse a toda a gente com a solução, ninguém aprenderia nada. A dificuldade que estás a ter é sinal de que precisas de aprender certas coisas... se eu te der a solução não aprenderás nada, apenas passarás ao próximo exercício com mais uma lacuna para resolver mais tarde.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

É isso que eu não sei bem o que tenho de fazer , sem ser em codigo , o que eu tenho de fazer é associar os animais ao dono e depois ver a idade desses animais que é isso q eu nao tou a conseguir principalmente a primeira parte

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

o que eu tenho de fazer é associar os animais ao dono e depois ver a idade desses animais que é isso q eu nao tou a conseguir principalmente a primeira parte

Já tentaste construir uma lista de animais para cada dono?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Tenta fazer algo assim:

{ 'Eva': ['Felix', 'Nemo', 'Dory'],
 'Ana': ... }

O resto torna-se muito mais simples. Mais que isto não te posso dizer.

Embora, se fizesses como eu já te indiquei acima (disse-te os passos todos!), seria também muito simples (e já estaria feito). Mas como já disse, não posso ser eu a resolver o problema (embora, se releres tudo com atenção, já o tenha resolvido e dado aqui a solução).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Não estou a perceber , eu tentei fazer isso que disseste agora , mas não adicionou os animais todos , so adicionou uma cada e ao adicionar desaparece a lista.

myvalues = [a['Nome do Dono'] for a in lista2 if 'Nome do Dono' in a]

novo_dict = {}
for nome in myvalues:
 novo_dict[nome] = []
 for i in  range(len(lista2)):
	  if nome == lista2 [i]['Nome do Dono']:
		 novo_dict[nome] = lista2 [i]['Nome do Animal']

Esta-me a dar isto:

{'Eva': 'Nemo', 'Ana': 'Raphael', 'Ada': 'Rantanplan'}

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

VivaPython,

  1. Obter uma lista dos donos
    donos = set(x['Nome do Dono'] for x in lista2)
    


  2. Para cada dono, obter uma lista dos seus animais
    # imaginemos que o dono é a Ana:
    dono = 'Ana'
    animais_da_ana = [ x['Nome do Animal'] for x in lista2 if x['Nome do Dono'] == dono ]
    # Isto dá: ['Michelangelo', 'Leonardo', 'Raphael']
    


  3. Para cada animal de cada dono, obter a sua idade
    # a função idade já tínhamos feito há bocado
    idades_dos_animais_da_ana = [ idade(x) for x in animais_da_ana ]
    # Isto dá: [57, 45, 57]
    


Agora falta-te adaptar isso para funcionar com um número arbitrário de donos, calcular as médias e construir a lista de dicionários que te é pedida.

A partir de agora só respondo a dúvidas relativas ao código propriamente dito, e não a dúvidas relacionadas com a forma como se resolve o problema.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Penso que o que vou dizer não tenho nada a ver com o problema mas com o codigo. O que tens na 2. precisa de algo para definir dono , no entanto a unica maneira que eu consigo fazer isso que ja tinha feito no comentario antes deste é fazer um ciclo e ao fazer nao vai adicionar os nomes todos a lista

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

VivaPython,

No ponto 1. eu definir uma variável donos que tem todos os donos (sem repetições). A ideia é utilizares essa lista no ponto 2.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Sim eu sei , o que eu tentei fazer foi :

donos = set([x['Nome do Dono'] for x in lista_donos])

for dono in donos:
  animais_da_ana = [ a['Nome do Animal'] for a in lista_donos if a['Nome do Dono'] == dono]

Porque a variavel dono tem de ser apenas um unico nome daquela lista, fiz assim , mas ja vi que não pode ser com um ciclo mas eu sem ciclo não sei como fazer

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Dentro do ciclo for estás sempre a atribuir os resultados à mesma variável, motivo pelo qual chegas ao final e apenas tens a lista de animais de um dos donos.

Em cada iteração tens que acrescentar os resultados a uma lista.

resultados = []
for dono in donos:
   resultados.append( ... )

Há quanto tempo estão a aprender Python e em que contexto/curso? As lacunas de conhecimento são muito significativas e vão ter muito impacto no futuro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
VivaPython

Eu comecei a aprender desde fevereiro ainda estou no inicio. Não estou em curso nenhum , apenas estou a repetir uma disciplina de 12º ano e quero ja começar a aprender para o ano quando começar os estudos ja estar bem preparado e por isso um amigo meu que anda na faculdade da-me os enunciados dos trabalhos caso eu queira e vou fazendo para mim

Editado por VivaPython

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.