Ir para o conteúdo
Reno70

Arredondar valores

Mensagens Recomendadas

Reno70

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
Reno70

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 por Reno70

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunuu

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 por brunuu

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

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:

  1. 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))
    


  2. 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 por pwseo
Adicionados exemplos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Reno70

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 por Reno70

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Reno70

" • Para efectuar o arredondamento simétrico de um número some-lhe 0,5 e tome a parte inteira. "

Editado por Reno70

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

" • 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

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

"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

"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

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

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 por pwseo
tags [tt]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Nome Original

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

"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
pwseo

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

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

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 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.