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.
- Poda27/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.
- Poda27/03/2021 a las 21:20
1
Sí, publique una muestra del archivo de texto.
- RJ Adriaansen27/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.
- 976995327/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 Knechtel27/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.
- Millas27/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
-pakpe27/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}")