Tengo archivos de Excel con datos sobre los puntajes de las pruebas de los estudiantes, pueden tomar una prueba hasta tres veces, pero necesito que mi programa reconozca el orden en que los tomaron y el archivo de Excel no está en orden. ...

1
Justin 5 mar. 2021 a las 03:58

4 respuestas

La mejor respuesta

Sugiero dar una representación para un intento como lo que he agregado. Puede ordenar cualquier tipo de lista con una tecla. Para obtener la "clave" para ordenar un intento, quiero decirle al método sorted que un intento está representado por su fecha y hora. Por lo tanto, usando lambda, podemos lograrlo. Si buscas en Google estos términos, obtendrás lo que buscas. Aquí hay un código de muestra:

from datetime import date,datetime,timedelta

class Student:
    def __init__(self, last_name, first_name ):
        self.first_name = first_name
        self.last_name = last_name

        # will hold Attempt objects that consist of score and date/time test taken
        self.attempts = []

    # I imagine I need something like this
    def order_attempts(self):
        self.attempts = sorted(self.attempts,key= lambda attempt:attempt.date_and_time_of_attempt)

class Attempt:
    def __init__(self, score_as_fraction, datetime_obj):
        self.score_as_fraction = score_as_fraction
        self.date_and_time_of_attempt = datetime_obj
    def __repr__(self):
        return str(self.date_and_time_of_attempt)+': '+str(self.score_as_fraction)

student = Student('Doe','John')
student.attempts=[Attempt(0.8,date.today()), Attempt(0.7,date.today() + timedelta(days=1)), Attempt(0.6,date.today() - timedelta(days=1))]
print(student.attempts)
student.order_attempts()
print(student.attempts)

Dando:

[2021-03-05: 0.8, 2021-03-06: 0.7, 2021-03-04: 0.6]
[2021-03-04: 0.6, 2021-03-05: 0.8, 2021-03-06: 0.7]
1
Zingerella 5 mar. 2021 a las 01:38

Creo que la pregunta es realmente cómo ordenar las instancias de Intento. Puede hacer esto haciendo que el intento de clase se pueda ordenar agregando un método __lt__, vea el ejemplo a continuación.

from datetime import datetime

class Student:

    def __init__(self, name, attempts):
        self.name = name
        self.attempts = attempts

    def order_attempts(self, reverse=False):
        self.attemtps = attempts.sort(reverse=reverse)

class Attempt:

    def __init__(self, topic, attempt_date, score):
        self.score = score
        self.attempt_date = attempt_date
        self.topic = topic

    def __lt__(self, other):
        return self.attempt_date < other.attempt_date

    def __repr__(self):
        return f'{self.attempt_date.date()}: {self.score}'

attempts = []
attempts.append(Attempt('Math', datetime(2021, 2, 3), 4))
attempts.append(Attempt('Math', datetime(2021, 2, 5), 5))
attempts.append(Attempt('Math', datetime(2021, 2, 7), 8))
stud2 = Student('Mike Owen', attempts)

stud2.order_attempts()
print(stud2.attempts)
stud2.order_attempts(reverse=True)
print(stud2.attempts)
[2021-02-03: 4, 2021-02-05: 5, 2021-02-07: 8]
[2021-02-07: 8, 2021-02-05: 5, 2021-02-03: 4]
1
Bruno Vermeulen 5 mar. 2021 a las 01:56

Con el código que ha publicado y también mencionando que pasaría un archivo de Excel, no podría hacerlo solo con el código que publicó. Tendría que leer el archivo de Excel y capturar esos valores obj de fecha y hora. Pero, si obtiene objetos de fecha y hora reales de lo que publicó, simplemente puede usar list.sort() para ordenar una lista de objetos en su lugar

import datetime

yesterday = datetime.date.today() - datetime.timedelta(days=1)
today = datetime.date.today()
tomorrow = datetime.date.today() + datetime.timedelta(days=1)

date_list =[today, tomorrow, yesterday]
print(date_list)

enter image description here

date_list.sort()
print(date_list)

enter image description here

1
Tyler Gallenbeck 5 mar. 2021 a las 01:24

Simplemente puede usar el atributo date_and_time_of_attempt del objeto de intento como clave de clasificación

self.attempts.sort(key = lambda attempt: attempt.date_and_time_of_attempt)
3
foglerit 5 mar. 2021 a las 01:43