2012-04-25 3 views
0

У меня естьудалить несколько «классов» из списка в Python

class rel: 
    child='' 
    parent='' 
listPar=[] 

и listPar У меня есть список этих классов (пардон терминов, я не уверен, если это называется класс, это ?), так что в listPar у меня есть, например: book book; Заголовок книги ; номер книга, название книги

И теперь им пытаются удалить все не уникальные вхождения, поэтому я хочу, чтобы иметь только

номер книгу; Название книги в listPar

Давайте предположим, что я следующий код:

variable="Book" 
variable2="Author" 
toIns=rel() 
toIns.parent=variable 
toIns.child=variable2 
listPar.append(toIns) 

toIns2=rel() 
toIns2.parent=variable 
toIns2.child=variable2 
listPar.append(toIns2) 

и теперь, как удалить все дубликаты? (Результат ->

for elem in listPar: 
    print "child:",elem.child,"parent:",elem.parent 

#child:author, parent:book 

Я попробовал несколько вещей, но ни один из них, казалось, полностью work..could пожалуйста, помогите мне

+1

Термин будет _объектами_ класса. – phg

+2

Или * экземпляры * также много использовать. –

ответ

5

Я предполагаю, что класс, который вы дали там 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 - я бы посоветовал вам читать и учиться использовать их перед чем-либо еще, поскольку это не приведет к множеству проблем ,

+0

Я бы сказал, что он пытался описать отношения, такие как «Rel (« Комната »,« Книга »), что означает, что комната может содержать книгу, а затем сохранять эти значения. Но вы совершенно правы, я бы предложил добавить '__eq__' в' Rel', тоже. – phg

+0

@phg Я действительно просто давал общий пример, идея могла быть применена в любом месте. –

+0

Прошу прощения, я не уверен, что теперь делать. Давайте предположим, что я следующий код: класс отн: ребенка = '' родителя = '' listPar = [] toIns = отн() toIns.parent = переменная toIns.child = Variable2 listPar.append (toIns) и теперь, как удалить все дубликаты? – Johnzzz

Смежные вопросы