Jump to content

Pylab: função para lista de tuplos


Go to solution Solved by pwseo,

Recommended Posts

Posted (edited)

Boa Tarde,

Precisava de uma ajuda:

Edited by Shad07
  • Replies 46
  • Created
  • Last Reply

Top Posters In This Topic

Posted

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?

Posted (edited)

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

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

Edited by Shad07
Posted

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.

Posted

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.

Posted

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?

Posted (edited)

pwseo,

Sinceramente estou um bocado baralhado

Edited by Shad07
Posted

É 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?

Posted

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)
Posted (edited)

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

A 2ª cria um dicionário

Edited by Shad07
Posted

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.

Posted

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

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

Posted

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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.