Diccionario y contador en Python para encontrar el ganador de las elecciones.

Dada una serie de nombres de candidatos en una elección. El nombre de un candidato en la array representa un voto emitido por el candidato. Escriba el nombre de los candidatos que recibieron Max voto. Si hay empate, escriba un nombre lexicográficamente más pequeño.
Ejemplos: 
 

Input :  votes[] = {"john", "johnny", "jackie", 
                    "johnny", "john", "jackie", 
                    "jamie", "jamie", "john",
                    "johnny", "jamie", "johnny", 
                    "john"};
Output : John
We have four Candidates with name as 'John', 
'Johnny', 'jamie', 'jackie'. The candidates
John and Johny get maximum votes. Since John
is alphabetically smaller, we print it.

Tenemos una solución existente para este problema, consulte Buscar ganador de una elección donde los votos se representan como enlaces de nombres de candidatos. Podemos resolver este problema rápidamente en python usando la estructura de datos del diccionario
Método 1: 
El enfoque es muy simple, 
 

  1. Convierta la lista de votos dada en un diccionario usando el método Counter (iterador). Tendremos un diccionario con nombres de candidatos como clave y su frecuencia (recuentos) como valor .
  2. Dado que más de 1 candidato puede obtener el mismo número de votos y en esta situación necesitamos imprimir un nombre lexicográficamente más pequeño, ahora crearemos otro diccionario recorriendo el diccionario creado anteriormente, el conteo de votos será Clave y los nombres de los candidatos serán Valor .
  3. Ahora encuentre el valor del voto máximo emitido por un candidato y obtenga una lista de candidatos mapeados en ese valor de conteo.
  4. Ordene la lista de candidatos que tienen el mismo número de votos máximos e imprima el primer elemento de la lista ordenada para imprimir el nombre lexicográficamente más pequeño.

Python3

# Function to find winner of an election where votes
# are represented as candidate names
from collections import Counter
 
def winner(input):
 
    # convert list of candidates into dictionary
    # output will be likes candidates = {'A':2, 'B':4}
    votes = Counter(input)
     
    # create another dictionary and it's key will
    # be count of votes values will be name of
    # candidates
    dict = {}
 
    for value in votes.values():
 
        # initialize empty list to each key to
        # insert candidate names having same
        # number of votes
        dict[value] = []
 
    for (key,value) in votes.items():
        dict[value].append(key)
 
    # sort keys in descending order to get maximum
    # value of votes
    maxVote = sorted(dict.keys(),reverse=True)[0]
 
    # check if more than 1 candidates have same
    # number of votes. If yes, then sort the list
    # first and print first element
    if len(dict[maxVote])>1:
        print (sorted(dict[maxVote])[0])
    else:
        print (dict[maxVote][0])
 
# Driver program
if __name__ == "__main__":
    input =['john','johnny','jackie','johnny',
            'john','jackie','jamie','jamie',
            'john','johnny','jamie','johnny',
            'john']
    winner(input)

Producción: 
 

john

Complejidad temporal : O(nlogn) 
Espacio auxiliar : O(n)

Método 2: 
Este es un método más corto. 
1. Cuente el número de votos de cada persona y guárdelos en un diccionario. 
2. Encuentra el número máximo de votos. 
3. Encuentre la(s) persona(s) correspondiente(s) que tenga(n) votos igual al número máximo de votos. 
4. Como queremos una salida de acuerdo con el orden lexicográfico, ordene la lista e imprima el primer elemento. 
 

Python3

from collections import Counter
 
votes =['john','johnny','jackie','johnny','john','jackie',
    'jamie','jamie','john','johnny','jamie','johnny','john']
 
#Count the votes for persons and stores in the dictionary
vote_count=Counter(votes)
 
#Find the maximum number of votes
max_votes=max(vote_count.values())
 
#Search for people having maximum votes and store in a list
lst=[i for i in vote_count.keys() if vote_count[i]==max_votes]
 
#Sort the list and print lexicographical smallest name
print(sorted(lst)[0])

Producción: 
 

john

Complejidad temporal : O(n) 
Espacio auxiliar : O(1)
 

Publicación traducida automáticamente

Artículo escrito por Shashank Mishra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *