How to reduce the number of elifs to find the letter that is most used at the beginning of the names?

Asked

Viewed 54 times

-1

lista_nomes = []
lista_idade = []
lista_sexo = []
idade_cont_menores = 0
idade_cont_maiores = 0
sexo_op = ['m', 'f']
sexo_cont_masculino = 0
sexo_cont_feminino = 0
cont_maiores_masculino = 0
cont_maiores_femininos = 0
cont_menores_masculinos = 0
cont_menores_femininos = 0
letras = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
          'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
cont_letras = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
a = 0

qtn = int(input('Digite a quantidade de pessoas a serem cadastradas: '))

for c in range(0, qtn):
    print('-'*15)

    lista_nomes.append((str(input('Nome: '))).strip().lower())
    if 'a' in (lista_nomes[-1])[0]:
        cont_letras.insert(1, ((cont_letras[1])+1))
    elif 'b' in (lista_nomes[-1])[0]:
        cont_letras.insert(2, ((cont_letras[2])+1))
    elif 'c' in (lista_nomes[-1])[0]:
        cont_letras.insert(3, ((cont_letras[3])+1))
    elif 'd' in (lista_nomes[-1])[0]:
        cont_letras.insert(4, ((cont_letras[4])+1))
    elif 'e' in (lista_nomes[-1])[0]:
        cont_letras.insert(5, ((cont_letras[5])+1))
    elif 'f' in (lista_nomes[-1])[0]:
        cont_letras.insert(6, ((cont_letras[6])+1))
    elif 'g' in (lista_nomes[-1])[0]:
        cont_letras.insert(7, ((cont_letras[7])+1))
    elif 'h' in (lista_nomes[-1])[0]:
        cont_letras.insert(8, ((cont_letras[8])+1))
    elif 'i' in (lista_nomes[-1])[0]:
        cont_letras.insert(9, ((cont_letras[9])+1))
    elif 'j' in (lista_nomes[-1])[0]:
        cont_letras.insert(10, ((cont_letras[10])+1))
    elif 'k' in (lista_nomes[-1])[0]:
        cont_letras.insert(11, ((cont_letras[11])+1))
    elif 'l' in (lista_nomes[-1])[0]:
        cont_letras.insert(12, ((cont_letras[12])+1))
    elif 'm' in (lista_nomes[-1])[0]:
        cont_letras.insert(13, ((cont_letras[13])+1))
    elif 'n' in (lista_nomes[-1])[0]:
        cont_letras.insert(14, ((cont_letras[14])+1))
    elif 'o' in (lista_nomes[-1])[0]:
        cont_letras.insert(15, ((cont_letras[15])+1))
    elif 'p' in (lista_nomes[-1])[0]:
        cont_letras.insert(16, ((cont_letras[16])+1))
    elif 'q' in (lista_nomes[-1])[0]:
        cont_letras.insert(17, ((cont_letras[17])+1))
    elif 'r' in (lista_nomes[-1])[0]:
        cont_letras.insert(18, ((cont_letras[18])+1))
    elif 's' in (lista_nomes[-1])[0]:
        cont_letras.insert(19, ((cont_letras[19])+1))
    elif 't' in (lista_nomes[-1])[0]:
        cont_letras.insert(20, ((cont_letras[20])+1))
    elif 'u' in (lista_nomes[-1])[0]:
        cont_letras.insert(21, ((cont_letras[21])+1))
    elif 'v' in (lista_nomes[-1])[0]:
        cont_letras.insert(22, ((cont_letras[22])+1))
    elif 'w' in (lista_nomes[-1])[0]:
        cont_letras.insert(23, ((cont_letras[23])+1))
    elif 'x' in (lista_nomes[-1])[0]:
        cont_letras.insert(24, ((cont_letras[24])+1))
    elif 'y' in (lista_nomes[-1])[0]:
        cont_letras.insert(25, ((cont_letras[25])+1))
    elif 'z' in (lista_nomes[-1])[0]:
        cont_letras.insert(26, ((cont_letras[26])+1))

    lista_idade.append(int(input('Idade: ')))
    if lista_idade[-1] < 18:
        idade_cont_menores += 1
    else:
        idade_cont_maiores += 1
    lista_sexo.append((str(input('Sexo[M/F}: '))).strip().lower())
    if lista_sexo[-1] not in sexo_op:
        print('Está opção é invalida!')
    elif lista_sexo[-1] == sexo_op[0]:
        sexo_cont_masculino += 1
        if lista_idade[-1] >= 18:
            cont_maiores_masculino += 1
        else:
            cont_menores_masculinos += 1
    else:
        sexo_cont_feminino += 1
        if lista_idade[-1] >= 18:
            cont_maiores_femininos += 1
        else:
            cont_menores_femininos += 1

print('-'*15, 'DADOS INSIRIDOS', '-'*15)

print('Nomes: {}'.format(lista_nomes))
print('Idades: {}'.format(lista_idade))
print('Sexo: {}'.format(lista_sexo))

print('-'*15, 'ANALISE DE DADOS', '-'*15)

idade_mais_velho = max(lista_idade)
id_idade_mais_velho = lista_idade.index(idade_mais_velho)
nome_idade_mais_velho = lista_nomes[id_idade_mais_velho]
idade_mais_novo = min(lista_idade)
id_idade_mais_novo = lista_idade.index(idade_mais_novo)
nome_idade_mais_novo = lista_nomes[id_idade_mais_novo]
idade_media = (sum(lista_idade) / (len(lista_idade)))


print('A pessoa mais nova é {} e ele(a) possui {} anos'.format(
    nome_idade_mais_novo, idade_mais_novo))
print('A pessoa mais velha é {} e ele(a) possui {} anos' .format(
    nome_idade_mais_velho, idade_mais_velho))
print('A media entre as idades das {} pessoas é {:.0} anos'.format(qtn, idade_media))

print('\nO numero de maiores de idade é: {}' .format(idade_cont_maiores))
print('Sendo {} mulheres e {} homens' .format(
    cont_maiores_femininos, cont_maiores_masculino))
print('O numero de pessoa menores de idade é: {}' .format(idade_cont_menores))
print('Sendo {} mulheres e {} homens' .format(
    cont_menores_femininos, cont_menores_masculinos))

print('\nO numero de mulheres é: {}' .format(sexo_cont_feminino))
print('O numero de homens é: {}' .format(sexo_cont_masculino))

print('A letra {} é a que mais aparece como inicial! \nAparecendo como inicial {} veses' .format(
    letras[1-(cont_letras.index(max(cont_letras)))], max(cont_letras)))


print('-'*15, 'FIM DA ANALISE', '-'*15)

1 answer

1


Specifically for counting letters, use a dictionary instead of a list:

cont_letras = {}
for c in range(qtn):
    nome = str(input('Nome: ')).strip().lower()
    cont_letras[nome[0]] = cont_letras.get(nome[0], 0) + 1
    lista_nomes.append(nome)
    ...

The keys of the dictionary are the letters, and the values are the respective amount. Note that I used get(nome[0], 0), thus, if the letter does not exist in the dictionary, its initial value is zero (and we are already 1 then to indicate that there is already 1 occurrence of this letter).

If the letter already exists, its amount is incremented by 1. Then, to get the most frequent letter:

letra_mais_frequente = max(cont_letras.items(), key=lambda d: d[1])
print('A letra {} é a que mais aparece como inicial! \nAparecendo como inicial {} veses'
    .format(letra_mais_frequente[0], letra_mais_frequente[1]))

items() returns all key-value pairs, and the lambda past to key says to use the value. The return is a tuple containing the key (letter) whose value (quantity) is the highest of all in the dictionary.

Remembering that, in case of a tie, only one of the letters will be returned. If you want to return all the letters that are most frequent, just go through the dictionary looking for all keys whose values are equal to the maximum found:

print('As letras mais frequentes aparecem {} vezes, são elas: {}'
    .format(letra_mais_frequente[1], ', '.join(filter(lambda k: cont_letras[k] == letra_mais_frequente[1], cont_letras.keys()))))

Although for your case, a better option is to use a Counter, that serves just what you need:

from collections import Counter
cont_letras = Counter()

for c in range(quantidade):
    nome = str(input('Nome: ')).strip().lower()
    cont_letras.update([nome[0]])
    lista_nomes.append(nome)
    ...

And to get the most frequent letter:

letra_mais_frequente = cont_letras.most_common(1)[0]
print('A letra {} é a que mais aparece como inicial! \nAparecendo como inicial {} veses'
    .format(letra_mais_frequente[0], letra_mais_frequente[1]))

Browser other questions tagged

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