Создание уникального списка объектов из нескольких списков - PullRequest
4 голосов
/ 11 августа 2011

Я определил пользовательский объект с несколькими полями.

Например, скажем, у меня есть объект Student, который состоит из имени, идентификатора и возраста.Чтобы сравнить двух учеников и определить, являются ли они одним учеником или нет, я внедрил метод __ eq__, который будет возвращать, если совпадают возраст, имя и ID двух учеников.

def __eq__(self, other):
   return self.name == other.name and self.ID == other.ID and self.age == other.age

МедведьИмейте в виду, что ученик является лишь примером, поэтому тот факт, что идентификаторы ученика имеют тенденцию быть уникальными, не учитывается.

Предположим, у меня есть следующие списки зачисления с произвольным числом объектов ученика

[S1, S2, S3]
[S2, S3]
[S3, S5, S4]
[S1, S4, S2, S1]

Я хотел бы создать некоторую структуру данных, которая будет содержать следующие элементы

S1, S2, S3, S4, S5

Самый простой способ сделать это - инициализировать некоторую структуру данных, которая может содержать много вещей, захватить элемент,проверьте, существует ли он в структуре, и добавьте его, если его нет.

new_list = some_new_list 
for each list of students:
  for each student in the list:
     check if the student is in new_list
     #decide what to do 

Если бы я решил реализовать его как простой список, я мог бы потенциально сделать много сравнений, так как мой список продолжаетрасти, особенно если у меня есть смешное количество студентов и списков зачисления.

Какой эффективный способ реализации тего?Как для сравнения двух объектов, так и для последующего использования этого метода сравнения для создания уникального набора объектов.

РЕДАКТИРОВАТЬ: поэтому я попробовал простую реализацию набора.

>>>a = Student("sample", 1234, 18)
>>>b = Student("sample", 1234, 18)
>>>students = set()
>>>students.add(a)
>>>b in students
False
>>>b == a
True

Я что-то не так делаю?

Ответы [ 2 ]

8 голосов
/ 11 августа 2011
from itertools import chain
myset = set(chain(iterable1, iterable2, iterable3, iterable4))

Вы получаете уникальные предметы, и вы повторяете каждую итерацию только один раз.chain делает одну длинную итерацию из серии итераций.Если вам нужно отсортировать, sorted(myset) даст вам отсортированный список.

Ваш класс Student должен реализовать __hash__, который совместим с __eq__:

def __hash__(self):
    return (self.name, self.ID, self.age).__hash__()
0 голосов
/ 11 августа 2011

У меня есть только одно слово для вас.

набор

Вот документы для наборов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...