Сравните два списка объектов класса и сохраните разницу и равенство в Python

#python #class #list-comprehension

Вопрос:

В настоящее время я застрял, и я надеюсь, что кто-нибудь здесь сможет мне помочь. Я пытаюсь добиться следующего: у меня есть два API, каждый из которых предоставляет мне список учебных курсов, представленных в виде экземпляра класса python. С одной стороны, есть API MS Learn, и рабочий процесс заключается в том, что я получаю их, сопоставляю данные и вставляю их в свою базу данных. Но прежде чем я это сделаю, я хочу проверить наличие 1.) дублированных курсов и 2.) если есть дубликат — может быть, он новее, чем мой сохраненный курс в моей базе данных? И 3.) Есть ли у меня в базе данных курсы, которых нет в списке курсов MS Learn?

Атрибуты, которые мне нужно проверить, — это «Идентификатор ссылки» для дураков / несуществующих курсов на внешней стороне и «created_at», если что-то новее / старше. Вместо диких циклов и сохранение значений в другой список, который я хотел бы использовать что-то более чистое и обновления, как пользовательский эквалайзер функция, а затем сравнение двух списков класса и объектов учета 1. все новые курсы, удаляя дубликаты из списка и 2. разница в том, что не существует в списке внешних курсов, так что я могу удалить их

Извините за длинный текст, вот немного кода:

 @dataclass
class Courses:
    id: str
    title: str
    description: str
    courseUrl: str
    referenceId: str
    providerId: int
    publishingState: str
    createdAt: str
    updatedAt: str
 

Первая попытка пользовательской функции эквалайзера — никогда не использовал ее до idk, если это сработает:

 def __eq__(self, other):
    if isinstance(other, Courses):
        return self.title == other.title 
               and self.description == other.description 
               and self.courseUrl == other.courseUrl 
               and self.referenceId == other.referenceId 
               and self.providerId == other.providerId 
               and self.publishingState == other.publishingState 
               and self.createdAt == other.createdAt 
               and self.updatedAt == other.updatedAt

    return False
 

Первое начало моего циклического хаоса:

     internal_courses = get_courses(request)
    internal_reference_ids = []
    duplicated_courses = []

    for int_course in internal_courses:
        internal_reference_ids.append(int_course.referenceId)

    for ext_course in external_courses:
        if ext_course.referenceId in internal_reference_ids:
            duplicated_courses.append(ext_course)
            external_courses.remove(ext_course)
 

Заранее большое вам спасибо, мне не терпится узнать что-то новое 🙂

Ответ №1:

Определенный вами __eq__ метод позволяет сравнивать экземпляры классов, подобные этому:

 if course_a == course_b:
    # Do something
 

При сравнении двух списков вместо этого вы вызываете list.__eq__ метод. Если этот список содержит объекты ваших курсов (кстати, вы должны использовать единственную форму, так как это один курс), они будут сравниваться с использованием определенного __eq__ вами метода.
Это означает, что вы можете просто сравнить [course_a, course_b] == [course_a, course_c] , и это должно работать так, как вы задумали.

 class Example:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
      
    def __eq__(self, other):
        return self.arg1 == other.arg1 and self.arg2 == other.arg2
      
# Initialize two instances with identical arguments.
one = Example('x', 'y')
two = Example('x', 'y')

print(one == two)   # True

a = [one]
b = [two]

print(a == b)   # Also True
 

P.S.
Проверьте @dataclass(eq=True) , так как это делает почти то же самое