Reno70 0 Denunciar mensagem Publicado 26 de Abril de 2016 Eu tenho a seguinte lista de dicionários e as values correspondem ao valor de média , por exemplo , no 1º aparece 4 , mas na verdade da 4,6666. Gostava de saber como e que se arrendonda , já tentei com o round , mas fica igual. [{'Nome do Dono': 'Eva', 'Media de Idade': 4}, {'Nome do Dono': 'Ana', 'Media de Idade': 53}, {'Nome do Dono': 'Ada', 'Media de Idade': 12}] Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
brunuu 21 Denunciar mensagem Publicado 26 de Abril de 2016 Mas para arredondar valores usa-se mesmo o round. É suposto funcionar. Mostra como é que metes o código com o round. Olha aqui um exemplo do round http://www.tutorialspoint.com/python/number_round.htm Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Reno70 0 Denunciar mensagem Publicado 26 de Abril de 2016 (editado) Esta é a parte do codigo e o que faço append é um valor de 4,66666. media_idades[key].append(round(sum(values)/len(values),2)) Da isto , eu quero que de 5 e não 4 nem 4.0 >>> {'Nome do Dono': 'Eva', 'Media de Idade': 4.0} Editado 26 de Abril de 2016 por Reno70 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
brunuu 21 Denunciar mensagem Publicado 26 de Abril de 2016 (editado) Esta é a parte do codigo e o que faço append é um valor de 4,66666. media_idades[key].append(round(sum(values)/len(values),2)) Da isto , eu quero que de 5 e não 4 nem 4.0 >>> {'Nome do Dono': 'Eva', 'Media de Idade': 4.0} Tira aquele dois. media_idades[key].append(round(sum(values)/len(values))) Editado 26 de Abril de 2016 por brunuu Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 26 de Abril de 2016 (editado) Reno70, Antes de começar, quero apenas deixar claro que em Python 3 este problema não acontece, diz respeito apenas à versão 2.x da linguagem Python. Nessas versões, o operador de divisão irá manter os tipos de dados envolvidos, ou seja, se estiveres a dividir um número inteiro por outro número inteiro, a divisão será a divisão inteira (que, no teu caso, descarta o resto e devolve apenas o quociente). Existem 2 formas de contornar o problema: Obrigar o python a fazer divisão decimal, convertendo um dos números para float: # Repara no float() ali metido para forçar divisão decimal round(float(sum(values)) / len(values)) Alterar o tipo de divisão feita pelo python, através do módulo __future__: # no início do ficheiro colocar esta linha: from __future__ import division ... # Já dará o resultado pretendido round(sum(values)) / len(values)) Fica aqui uma sessão interactiva para veres (em Python 2): >>> idades = [2, 4, 8] >>> >>> # Código original: ... >>> round(sum(idades) / len(idades)) 4.0 >>> >>> # 1º método ... >>> round(float(sum(idades)) / len(idades)) 5.0 >>> >>> # 2º método ... >>> from __future__ import division >>> round(sum(idades) / len(idades)) 5.0 No final, para converteres o 5.0 para 5, basta passares pela função int(). EDIT: E já agora, em Python 3 os resultados seriam os seguintes: >>> idades = [2, 4, 8] >>> round(sum(idades) / len(idades)) 5 Editado 26 de Abril de 2016 por pwseo Adicionados exemplos. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Reno70 0 Denunciar mensagem Publicado 26 de Abril de 2016 (editado) Tens razão pwseo , só uma coisa , eu no enunciado tenho escrito " somar 0.5 e tomar a parte inteira " , sabes como e que isso se faz ? Editado 26 de Abril de 2016 por Reno70 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 26 de Abril de 2016 Isso devia ser uma forma de chegar ao resultado pretendido de uma forma pouco clara Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Reno70 0 Denunciar mensagem Publicado 27 de Abril de 2016 (editado) " • Para efectuar o arredondamento simétrico de um número some-lhe 0,5 e tome a parte inteira. " Editado 27 de Abril de 2016 por Reno70 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 27 de Abril de 2016 " • Para efectuar o arredondamento simétrico de um número some-lhe 0,5 e tome a parte inteira. " É o que te tinha dito: uma forma de assegurar que o arredondamento é simétrico em Python 2. Em Python 3, ou com as soluções que te dei isso acontece naturalmente Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 29 de Abril de 2016 Boas, eu tinha o mesmo problema com a divisão do 14 por 3 não dar 5 e já o resolvi. No entanto, os métodos não só alteram o valor da conta 14/3, como alteram valores de outra divisões, por exemplo: total_idades = {'Eva': 14, 'Ana': 159, 'Ada': 12} vezes_nomes = {'Eva': 3, 'Ana': 3, 'Ada': 1} for i in vezes_nomes: media = int(round(float(total_idades.get(i)/vezes_nomes.get(i) + 0.5))) total_idades[i] = media Output: [{'Nome do dono': 'Eva', 'Media das idades': 5}, {'Nome do dono': 'Ana', 'Media das idades': 53}, {'Nome do dono': 'Ada', 'Media das idades': 12}] #output esperado [{'Nome do dono': 'Eva', 'Media das idades': 5}, {'Nome do dono': 'Ana', 'Media das idades': 54}, {'Nome do dono': 'Ada', 'Media das idades': 13}] #output obtido - o primeiro está certo, mas os últimos dois estão errados Eu percebi o que foi dito até agora no tópico. A minha questão é se existe alguma maneira de obter o output esperado sem criar mais linhas de código. É que se existir eu não sei como o fazer.. Obrigado Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 30 de Abril de 2016 "Nome Original", O que altera o valor da operação é a adição dos 0,5. As minhas soluções conseguem obter o valor pretendido sem adicionar os tais 0,5. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 30 de Abril de 2016 "Nome Original", O que altera o valor da operação é a adição dos 0,5. As minhas soluções conseguem obter o valor pretendido sem adicionar os tais 0,5. Eu sei que altera, mas se eu retirar o 0,5, continuo a obter 4 como resultado e os dois resultados ficam corretos Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 30 de Abril de 2016 Ao retirares o 0.5 tens que utilizar a função round(), caso contrário a int vai apenas cortar a parte decimal sem arredondar. Eu prefiro utilizar a função round() pois fica mais explícito o que está a acontecer. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 1 de Maio de 2016 (editado) Ao retirares o 0.5 tens que utilizar a função round(), caso contrário a int vai apenas cortar a parte decimal sem arredondar. Eu prefiro utilizar a função round() pois fica mais explícito o que está a acontecer. mas eu utilizei a função round() Editado 1 de Maio de 2016 por pwseo tags [tt] Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 1 de Maio de 2016 Mostra lá como tens o código então Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 1 de Maio de 2016 Boas, eu tinha o mesmo problema com a divisão do 14 por 3 não dar 5 e já o resolvi. No entanto, os métodos não só alteram o valor da conta 14/3, como alteram valores de outra divisões, por exemplo: total_idades = {'Eva': 14, 'Ana': 159, 'Ada': 12} vezes_nomes = {'Eva': 3, 'Ana': 3, 'Ada': 1} for i in vezes_nomes: media = int(round(float(total_idades.get(i)/vezes_nomes.get(i) + 0.5))) total_idades[i] = media Output: [{'Nome do dono': 'Eva', 'Media das idades': 5}, {'Nome do dono': 'Ana', 'Media das idades': 53}, {'Nome do dono': 'Ada', 'Media das idades': 12}] #output esperado [{'Nome do dono': 'Eva', 'Media das idades': 5}, {'Nome do dono': 'Ana', 'Media das idades': 54}, {'Nome do dono': 'Ada', 'Media das idades': 13}] #output obtido - o primeiro está certo, mas os últimos dois estão errados Eu percebi o que foi dito até agora no tópico. A minha questão é se existe alguma maneira de obter o output esperado sem criar mais linhas de código. É que se existir eu não sei como o fazer.. Obrigado É o primeiro bloco de código Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 1 de Maio de 2016 "Nome Original", Eu disse acima que tu tens duas opções: utilizas o round() OU adicionas 0,5. Tu fizeste ambas as coisas, daí o resultado errado. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 1 de Maio de 2016 Mesmo que eu só use uma das duas, o resultado dá sempre errado.. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 1 de Maio de 2016 Reparei agora que o teu código está mal escrito. Tu colocaste toda a divisão dentro de float(...), quando era suposto apenas colocares o numerador lá, caso contrário é feita uma divisão inteira como habitualmente, e o resultado sai errado. Ainda assim, tens que optar: round() ou +0,5. E já agora, quem ensinou a utilizar dict.get(key) em vez de dict[key]? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Nome Original 0 Denunciar mensagem Publicado 1 de Maio de 2016 Ah ok, não tinha reparado nisso. Assim, já me dá o resultado certo. Muito obrigado ! Eu só tinha o 0,5 ali porque quis experimentar uma coisa. E já agora, quem ensinou a utilizar dict.get(key) em vez de dict[key]? Fui à procura na net, como fazer essa ação e encontrei isso. Mas há alguma diferença entre esses dois comandos, ou ambos fazem a mesma coisa ? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 2 de Maio de 2016 Fui à procura na net, como fazer essa ação e encontrei isso. Mas há alguma diferença entre esses dois comandos, ou ambos fazem a mesma coisa ? O mais idiomático é utilizar a forma com []. A outra é normalmente reservada para casos muito específicos onde se faça uso do segundo argumento da get(). Quem vos ensina Python? Ou também estás, como outros membros aqui do fórum, a fazer exercícios de uma ficha dada por um amigo para no próximo ano fazer as cadeiras de programação? 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 contaEntra
Já tem conta? Inicie sessão aqui.
Entrar Agora