Я предполагаю, что класс, который вы дали там ISN»? (как это было бы бесполезно), но самая легкая вещь для вас здесь - предполагая, что порядок ваших элементов не имеет для вас значения, заключается в том, чтобы сделать ваш список в набор, который удалит все дубликаты.
>>> a = ["test", "test", "something", "else"]
>>> a
['test', 'test', 'something', 'else']
>>> set(a)
{'test', 'something', 'else'}
Здесь у меня есть строки, но вы можете использовать любой класс, который предоставляет e качественный оператор и хеш-функцию. Функция равенства используется для проверки того, являются ли оба класса одинаковыми (как для пользовательского класса, вам нужно определить это), и хэш используется для того, чтобы сделать наборы очень эффективными. Два класса, дающие одинаковый хэш , должны быть одинаковыми. У вас могут быть два класса с одинаковым хешем, которые не совпадают (он вернется к оператору равенства), но чем больше это произойдет, тем медленнее будет. В общем, использование суммы хэшей компонентов класса, которые вы используете для проверки равенства, является хорошим способом создания достойного хэша.
Так, например:
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __eq__(self, other):
return self.title == other.title and self.author == other.author
def __hash__(self):
return hash(self.title)+hash(self.author)
def __repr__(self):
return "Book("+repr(self.title)+", "+repr(self.author)+")"
Мы можем использовать этот класс, как и раньше.
>>> a = [Book("Some Book", "Some Guy"), Book("Some Book", "Some Guy"), Book("Some Other Book", "Some Other Guy")]
>>> a
[Book('Some Book', 'Some Guy'), Book('Some Book', 'Some Guy'), Book('Some Other Book', 'Some Other Guy')]
>>> set(a)
{Book('Some Other Book', 'Some Other Guy'), Book('Some Book', 'Some Guy')}
Если вы заботитесь о порядке элементов, даже после удаления дубликатов, то вы можете сделать это:
def remove_duplicates_preserving_order(seq):
seen = set()
return [ x for x in seq if x not in seen and not seen.add(x)]
Это работает путем взлома Словаря постижения немного - set.add()
всегда возвращает 0 , поэтому вы можете проверить, что это false (что всегда будет), чтобы добавить элемент в набор.
Edit для обновления:
Пожалуйста, обратите внимание, что PEP-8 reccomends использованием CapWords
для классов и lowercase_with_underscores
для локальных переменных.
У вас, похоже, есть недоразумение о том, как работают классы Python. Этот класс не имеет большого смысла, так как это все атрибуты класса, а не атрибуты экземпляра .Это означает, что они будут одинаковыми для всех экземпляров класса , и это не то, что вы хотите. Это означает, что когда вы меняете их во второй раз, вы будете менять его для всех экземпляров, делая их все тем же.
Чтобы сделать переменные экземпляра (тип, который вы хотите), вы хотите создать их внутри конструктор (__init__()
) - проверьте мой класс класса, чтобы узнать, как это работает. После того, как вы это сделали, вам необходимо реализовать __eq__()
и __hash__()
функции, чтобы Python знал, что означает, что для двух элементов вашего класса должно быть равно. Затем вы можете использовать описанные выше методы (либо набор, либо функцию , которую я дал) для удаления дубликатов.
Обратите внимание, что если это все, что вы хотите делать с вашими данными, класс может быть излишним. Если вы всегда будете иметь две вещи, вы могли бы просто использовать кортеж:
>>> a = [("Book", "Author"), ("Book", "Author"), ("OtherBook", "OtherAuthor")]
>>> set(a)
{('Book', 'Author'), ('OtherBook', 'OtherAuthor')}
Как кортежи уже определить равенство для вас, как сумма их частей.
В целом у вас, похоже, не хватает понимания того, как классы создаются и используются в Python - я бы посоветовал вам читать и учиться использовать их перед чем-либо еще, поскольку это не приведет к множеству проблем ,
Термин будет _объектами_ класса. – phg
Или * экземпляры * также много использовать. –