Python con la puntuación más alta

CorePress2024-01-25  8

Me está resultando difícil descubrir cómo hacer que este código funcione. Necesito ingresar un archivo de texto, que tiene una lista de nombres y puntajes, luego necesito dividir el nombre del puntaje y luego usar una declaración if para verificar si el puntaje es mayor que el puntaje mínimo.

El archivo de texto tiene este aspecto:

Jan  86 
Drew  92 
Blake  85 
Alex  81 
Taylor  88 
Jordan  72
Cam  89

Tengo el siguiente código hasta ahora:

SCORE_POSITION_IN_ENTRY = 0
NAME_POSITION_IN_ENTRY = ""


def main (student_name, student_score):
    print (f"Highest score: {student_score}")
    print (f"Achieved by: {student_name}")

def read_file (scores):   
    list_of_grades = ""   
    data_list = []
      
    infile = open('scores.txt','r')
    list_of_grades = infile.readline()
    
    while (list_of_grades != ""):
        data_list = int(list_of_grades)        
        list_of_grades = infile.readline()
    
    infile.close()
      
    return data_list


def find_max_score(data_list):
    entry_in_list = []
    maximum_score = 0
    
    #splitting the list
    entry_in_list = data_list.split('')
      
    current_score=int(entry_in_list[SCORE_POSITION_IN_ENTRY])
      
    if current_score > maximum_score:      
        maximum_score = current_score
        student_name = entry_in_list[NAME_POSITION_IN_ENTRY];
        student_score = entry_in_list[SCORE_POSITION_IN_ENTRY];
        
    return student_name, student_score


main() 

4

Proporcione el MRE esperado: ejemplo mínimo y reproducible. Muestre dónde se desvían los resultados intermedios de los esperados. deberíamos bPodemos pegar un solo bloque de su código en un archivo, ejecutarlo y reproducir su problema. Esto también nos permite probar cualquier sugerencia en su contexto. Esperamos un ejemplo funcional mínimo del problema, incluido el código apropiado para rastrear la operación interna. "Estoy pasando por un momento difícil" no es una especificación de problema.

- Poda

27/03/2021 a las 21:19

1

El código publicado no se ejecuta; Depende de un archivo privado. A menos que haya aislado su problema en la lectura del archivo, no debería ser parte de su publicación. No esperes que lo hagamosproporcione datos de prueba: simplemente reemplace la entrada de su archivo con un caso de prueba (por ejemplo, una lista) que genere el problema.

- Poda

27/03/2021 a las 21:20

1

Sí, publique una muestra del archivo de texto.

- RJ Adriaansen

27/03/2021 a las 21:23

1

Su código publicado solo llama a la función principal, que solo imprimedos lineas. Incluso llama incorrectamente a la función principal, ya que no pasa los dos argumentos requeridos al llamar. Las funciones read_file y find_max_score no se ejecutan en absoluto ni se llaman en ningún lugar. En otras palabras, su código es una colección suelta de funciones que no interactúan y no sucederá nada, excepto un TypeError.

- 9769953

27/03/2021 a las 21:32

Bien, ¿cuál es tu pregunta? ¿Qué pasó cuando intentaste usar el código? ¿En qué se diferencia eso de lo que se supone que debe suceder? ¿Qué partes parecen estar haciendo y qué partes no?¿En qué se supone que deben hacerlo? ¿Intentaste probar eso? ¿Qué crees que te impide hacer que el código funcione?

- Karl Knechtel

27/03/2021 a las 21:54



------------------------------------

Su archivo de texto tiene dos espacios entre los nombres y las partituras. Este código funcionará:

def main(filename):
    student_name, student_score = find_max_score(read_file(filename))
    print(f"Highest score: {student_score}")
    print(f"Achieved by: {student_name}")


def read_file(filename):
    data_list = []
    with open(filename, 'r') as reader:
        for line in reader.readlines():
            data_list.append(line)
    return (data_list)


def find_max_score(data_list):
    max_score = 0
    best_student = None
    for entry in data_list:
        name, score = entry.split('  ')
        if int(score) > max_score:
            max_score = int(score)
            best_student = name

    return (best_student, max_score)


main('scores.txt')

#output:
Highest score: 92
Achieved by: Drew

2

Gracias por tu sabiduría, eres un salvavidas. Que tengas un bendecido día.

- Millas

27/03/2021 a las 22:15

@Miles De nada. La etiqueta en Stack Overflow es aceptar la respuesta que funcione para usted. stackoverflow.com/help/someone-answers

-pakpe

27/03/2021 a las 22:39



------------------------------------

Puedes usar el módulo csv (documentación) para leer el archivo y la función max() para obtener la puntuación máxima.

import csv

with open("scores.txt") as csvfile:
    data = list(csv.reader(csvfile), delimiter="\t")

names, scores = [r[0] for r in data], [r[1] for r in data]
scores_dict = dict(zip(scores, names))

max_score = max(list(scores_dict))
person = scores_dict.get(person)

En este caso, max_score sería la puntuación máxima ypersona sería la persona que logró la puntuación máxima.



------------------------------------

Hacer las cosas un poco más limpias.

Nota:

No maneja duplicados Ejemplo: Drew 93 y Taylor 93 tienen la misma puntuación (se puede hacer si es necesario)
class ScoreIdentifier:
    def __init__(self, file_name):
        self.file_name = file_name

    def get_scores_from_input(self, to_dict=False):
        score_list = list()
        score_dict = dict()
        with open(self.file_name, 'r') as input_file:
            for line in input_file.readlines():
                if to_dict:
                    key, value = line.split("  ")
                    score_dict.update({key: int(value)})
                else:
                    score_list.append(line)

        if to_dict:
            return score_dict
        return score_list

    def get_max_score_using_dict(self):
        # Get dictionary of items from file
        score_dict = self.get_scores_from_input(to_dict=True)
        # Using max method on index 1 finding max
        return max(score_dict.items(), key = lambda k : k[1])

    def get_max_score(self):
        score_list = self.get_scores_from_input()
        max_score = 0
        best_student = None
        if score_list:  # Empty score list check
            for idx, entry in enumerate(score_list):
                name, score = entry.split('  ')
                # If there are same blank space between first name, second name and score
                # then below piece of code isolates them Ex:Input "Ross  Taylor  93" output: (['Ross', 'Taylor'], 93)
                # *name, score = entry.split('  ')


                if int(score) > max_score:
                    max_score = int(score)
                    best_student = name

        return best_student, max_score


if __name__ == '__main__':
    score_obj = ScoreIdentifier('scores.txt')

    student_name, student_score = score_obj.get_max_score_using_dict()
    print(f"Highest score: {student_score}")
    print(f"Achieved by: {student_name}")

    student_name, student_score = score_obj.get_max_score()
    print(f"Highest score: {student_score}")
    print(f"Achieved by: {student_name}")

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare