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

Guest Shad07

[Resolvido] Função para lista de tuplos; Dúvida em Pylab

Mensagens Recomendadas

pwseo

Shad07,

A primeira questão é relativamente simples: podes utilizar um dicionário onde armazenas a contagem de cada nome. Depois basta apresentar os resultados por ordem alfabética.

A segunda questão é um pouco mais complexa, mas também nada de especial: primeiro tens que ordenar a lista por data, e fazer uma soma cumulativa das calorias.

O que fizeste até agora?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

@pwseo Até agora tenho isto para a primeira função:

Mas não sei se será a melhor forma de fazer...

Editado por Shad07

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Vamos com calma, parece que estás ali a fazer alguma confusão na definição da função e invocação da mesma.

Tu já tinhas uma variável lista que continha os dados relevantes. Por esse motivo, a tua participacoes() seria antes definida assim:

def participacoes(dados):
   return collections.Counter(zip(*dados)[0])

Por outro lado, a invocação seria assim:

>>> participacoes(lista)
Counter({'Ana': 4, 'Eva': 2, 'Dulce': 1})

Invocar a função com o argumento 'dados' (repara nas aspas que colocaste lá) é errado e no teu caso só funciona porque voltaste a definir a variável dados dentro da tua função. É esta confusão a que me refiro.

O teu código leva-me ainda a colocar outra questão: tu percebes o que está a acontecer quando escreves zip(*dados)[0]? É uma operação composta razoavelmente complexa que me parece desnecessária.

Consigo replicar a tua função da seguinte forma:

def particip_pwseo(dados):
   return collections.Counter(elem[0] for elem in dados)

>>> particip_pwseo(lista):
Counter({'Ana': 4, 'Eva': 2, 'Dulce': 1})

Já agora, deixa-me perguntar-te: os resultados podem vir por qualquer ordem? Ou devem ser ordenados por ordem alfabética do nome?

Agora falta pensares numa forma de devolver apenas os números. Mais uma vez, lê com atenção o que escrevi e pensa se compreendeste tudo... Em caso de dúvida não hesites. É melhor perguntares do que utilizares código que não compreendes.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Vou tentar exemplificar sem te dar a solução directamente.

Imagina o seguinte dicionário d que, como sabes, não é ordenado:

>>> d = { 'd': 1, 'c': 2, 'b': 3, 'a': 4 }
>>> d
{'a': 4, 'd': 1, 'b': 3, 'c': 2}

O que acontece se aplicarmos a função sorted() a d?

>>> sorted(d)
['a', 'b', 'c', 'd']

A partir daqui, facilmente conseguimos extrair os números correspondentes pela ordem que obtivemos:

resultados = []
for x in sorted(d):
   resultados.append(d[x])

# ou, de uma forma mais compacta:
resultados = [ d[x] for x in sorted(d) ]

Com esta solução não precisas de dict.items() (que sugeri numa thread semelhante). O dict.items() é porreiro mas o motivo pelo qual é porreiro fica um pouco fora do âmbito deste tópico.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Shad07,

Tu percebes qual é o papel do nome dados na definição da função participacoes()? Algo me diz que não estás muito à vontade com a definição de funções.

E já tentaste testar o que o teu código faz passo-a-passo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

É conveniente que compreendas o que estás a fazer, caso contrário estás apenas a mexer em coisas complicadas sem saber o que fazem.

O que aprendeste sobre a definição de funções?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Aprendi o básico:

definir a função def(..), if's, while's, for's , ...

Na função particpacoes o argumento dados tem de receber uma lista de tuplos tal como está acima:

(...)

Se a função recebe a lista como argumento, por que motivo te referes a ela directamente dentro da função?

E outra questão: o que fazem, individualmente, estas linhas?

resultado = [ lista[x] for x in sorted(lista) ]
return collections.Counter(elem[0] for elem in resultado)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

A 1ª linha faz com que a lista fique ordenada alfabeticamente

A 2ª cria um dicionário

Editado por Shad07

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

E a pergunta agora é simplesmente: consegues perceber por que motivo essas 2 operações por essa ordem resultam num erro?

Que dúvidas tens em geral? Quais são os pontos de Python que menos compreendes (não especificamente neste problema). Fico com a impressão de que mesmo resolvendo este exercício, não compreendes de que forma o conseguiste.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

Não percebo porque é que dá erro...

Tenho mais dificuldades em é mesmo no criar a função, nunca sei por onde começar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Então tens que fazer isso manualmente, numa linha de comandos do Python.

Pegas na tua variável original, que chamaste de lista e vais aplicando o raciocínio até chegares ao resultado pretendido.

Colocas o seguinte num ficheiro, por exemplo shad07.py:

lista = [
   ('Ana', 'Lisboa', 42195, '10-18', 2224),
   ('Eva', 'Nova Iorque', 42195, '06-13', 2319),
   ('Ana', 'Toquio', 42195, '02-22', 2403),
   ('Eva', 'Sao Paulo', 21098, '04-12', 1182),
   ('Ana', 'Sao Paulo', 21098, '04-12', 1096),
   ('Dulce', 'Toquio', 42195, '02-22', 2449),
   ('Ana', 'Boston', 42195, '04-20', 2187)]

E agora invocas o interpretador assim:

$ python -i shad07.py

Agora tens pronto o ambiente para fazeres o que pretendes:

>>> [ elem[0] for elem in lista ]
['Ana', 'Eva', 'Ana', 'Eva', 'Ana', 'Dulce', 'Ana']
>>> from collections import Counter
>>> counts = Counter([ elem[0] for elem in lista ])
>>> counts
Counter({'Ana': 4, 'Eva': 2, 'Dulce': 1})
>>> sorted(counts)
['Ana', 'Dulce', 'Eva']
>>> [ counts[x] for x in sorted(counts) ]
[4, 1, 2]

Agora tens que converter isto para uma função... mais que isto não posso fazer.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Guest Shad07

shad07 , o que é q fizeste para te aparece isso? Que codigo usaste ?

VivaPython,

usei o código que está acima do comentário acima

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Mesmo assim, se estás a mostrar uma função a alguém, tens que mostrar também a linha do seu cabeçalho (ou seja, mostra).

Outra questão: por que motivo todos os testes dizem Expected nothing?

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.