error in Count function

Asked

Viewed 116 times

3

The function count is always showing the result 0, someone can help me?

nome = []
voto = []
aux = 1

while aux != 0:
    nome = str(input("Qual é o seu nome? "))
    aux = int(input("Qual é o melhor sistema operacional: Vote 1 pra Windows; Vote 2 para Linux; Vote 3 pra Mac Os; Vote 4 pra Outros: "))
    voto.append(aux)
    print( )

percentual1 = ([voto].count(1)) / len(voto)
percentual2 = [voto].count(2) / len(voto)
percentual3 = [voto].count(3) / len(voto)
percentual4 = [voto].count(4) / len(voto)

print("A quantidade de votos no total foi:", len(voto))
print("A quantidade de votos no Windows foi:", ([voto].count(1)))
print("A porcentagem de votos no Windows foi:", percentual1 * 100)
print("A quantidade de votos no Linux foi:", ([voto].count(2)))
print("A porcentagem de votos no Linux foi:", percentual2 * 100)
print("A quantidade de votos no Mac OS foi:", ([voto].count(3)))
print("A porcentagem de votos no Mac OS foi:", percentual3 * 100)
print("A quantidade de votos no Outros foi:", ([voto].count(4)))
print("A porcentagem de votos no Outros foi:", percentual4 * 100)

3 answers

5


This is happening because of the brackets you put in the variable voto before using the count:

[voto].count(1)

When you do this, you end up creating a new list that contains voto, and when calling the method count, does not find any value according to the given parameter.


To fix, just remove these brackets in all the snippets you did:

voto.count(1)
voto.count(2)
...
voto.count(4)

This will already correct the return of the method count.


But note that when typed 0 to get out of while, you include this value in the list voto:

voto.append(aux)

With this, even if I choose only one operating system, the percentage is 50%.

The ideal is that you do not include zero or even the other values that do not appear for you, if you want that only zero does not enter the votes, make a if before effecting the append of value:

if aux != 0:
  voto.append(aux)

If you want only valid data to be entered, you need to create a different condition for the if, example:

if aux > 0 and aux < 5:
  voto.append(aux)

With this your final code will be more or less as follows:

nome = []
voto = []
aux = 1

while aux != 0:
    nome = str(input("Qual é o seu nome? "))
    aux = int(input("Qual é o melhor sistema operacional: Vote 1 pra Windows; Vote 2 para Linux; Vote 3 pra Mac Os; Vote 4 pra Outros: "))
    print()

    if aux > 0 and aux < 5:
      voto.append(aux)

percentual1 = voto.count(1) / len(voto)
percentual2 = voto.count(2) / len(voto)
percentual3 = voto.count(3) / len(voto)
percentual4 = voto.count(4) / len(voto)

print("A quantidade de votos no total foi:", len(voto))
print("A quantidade de votos no Windows foi:", voto.count(1))
print("A porcentagem de votos no Windows foi:", percentual1 * 100)
print("A quantidade de votos no Linux foi:", voto.count(2))
print("A porcentagem de votos no Linux foi:", percentual2 * 100)
print("A quantidade de votos no Mac OS foi:", voto.count(3))
print("A porcentagem de votos no Mac OS foi:", percentual3 * 100)
print("A quantidade de votos no Outros foi:", voto.count(4))
print("A porcentagem de votos no Outros foi:", percentual4 * 100)

See online: https://repl.it/@Dadinel/Elementaryorchidnanotechnology#main.py


Documentation: https://docs.python.org/3/tutorial/datastructures.html

3

You just made a mess of the list syntax. When you will call the same to query some value, as the votes for each OS, you should not put your name between []. Soon just remove them that will work:

nome = []
voto = []
aux = 1

while aux != 0:
    nome = str(input("Qual é o seu nome? "))
    aux = int(input("Qual é o melhor sistema operacional: Vote 1 pra Windows; Vote 2 para Linux; Vote 3 pra Mac Os; Vote 4 pra Outros: "))
    voto.append(aux)
    print( )

percentual1 = (voto.count(1)) / len(voto)
percentual2 = voto.count(2) / len(voto)
percentual3 = voto.count(3) / len(voto)
percentual4 = voto.count(4) / len(voto)

print("A quantidade de votos no total foi:", len(voto))
print("A quantidade de votos no Windows foi:", (voto.count(1)))
print("A porcentagem de votos no Windows foi:", percentual1 * 100)
print("A quantidade de votos no Linux foi:", (voto.count(2)))
print("A porcentagem de votos no Linux foi:", percentual2 * 100)
print("A quantidade de votos no Mac OS foi:", (voto.count(3)))
print("A porcentagem de votos no Mac OS foi:", percentual3 * 100)
print("A quantidade de votos no Outros foi:", (voto.count(4)))
print("A porcentagem de votos no Outros foi:", percentual4 * 100)

3

The other answers have already explained your mistake, I would just like to add one detail.

Call count several times is not efficient for what you want to do, since each call of count scrolls through the list to get the element count (ie you are scrolling through the list 4 times, unnecessarily - in a variation of the Shlemiel the Painter’s Algorithm). In this case, a better option is to use a Counter, that iterates through the list once and already gets the count of all elements:

votos = []
opcoes = {
    '1': 'Windows', '2': 'Linux', '3': 'MacOS', '4': 'Outros'
}
texto_opcoes = '; '.join(f'Vote {i} para {desc}' for i, desc in opcoes.items())
while True:
    voto = input(f'Qual é o melhor sistema operacional: {texto_opcoes} (0 para sair):')
    if voto == '0':
        break
    elif voto in opcoes:
        votos.append(voto)
    else:
        print('Opção inválida')

from collections import Counter
c = Counter(votos)

print(f'A quantidade de votos no total foi: {len(votos)}')
for i, desc in opcoes.items():
    print(f'A quantidade de votos no {desc} foi: {c[i]}')
    print(f'A porcentagem de votos no {desc} foi: {c[i] * 100 / len(votos):.2f}%')

As you can see, I changed other things too. I changed the name of the list that holds the votes of voto for votos, because if it will hold more than one vow, it makes more sense that the name is plural. It may seem like a silly and insignificant detail, but giving better names helps a lot when programming.

I made a loop infinite (while True) to go reading the options, and the stop option is when the entered value is zero: in this case, I use break to interrupt the loop.

I put the options in a dictionary and used the keys as strings, so you don’t need to convert to int (because if a number is not entered, it will give error in the program). Because the fact that the keys are numbers is circumstantial, and if you want to change them to something else (for example, "a" for "Windows", "b" for "Linux", etc.), it would be enough to change the keys of the dictionary, and the rest of the code would remain the same.

And I use the same dictionary to show the available options, and also to show the statistics.


Although in this specific case, since dictionary keys are sequential numbers, they could also be in a list. What changes is that the indexes are numbers and start from scratch, so you should check if the conversion to int worked well, and subtract 1 when saving the vote (in addition to using enumerate to get indexes by iterating through the list):

votos = []
opcoes = [ 'Windows', 'Linux', 'MacOS', 'Outros']
texto_opcoes = '; '.join(f'Vote {i + 1} para {desc}' for i, desc in enumerate(opcoes))
while True:
    try:
        voto = int(input(f'Qual é o melhor sistema operacional: {texto_opcoes} (0 para sair):'))
        if voto == 0:
            break
        elif 1 <= voto <= len(opcoes):
            votos.append(voto - 1)
        else:
            print('Opção inválida')
    except ValueError:
        print('Não foi digitado um número')

from collections import Counter
c = Counter(votos)

print(f'A quantidade de votos no total foi: {len(votos)}')
for i, desc in enumerate(opcoes):
    print(f'A quantidade de votos no {desc} foi: {c[i]}')
    print(f'A porcentagem de votos no {desc} foi: {c[i] * 100 / len(votos):.2f}%')

Browser other questions tagged

You are not signed in. Login or sign up in order to post.