从python中的列表中删除多个"类"

Joh*_*zzz 0 python list duplicates

我有

class rel:
   child=''
   parent=''
listPar=[]
Run Code Online (Sandbox Code Playgroud)

在listPar中,我有一个这些类的列表(对不起,我不确定它是否被称为类,是吗?)所以在listPar中我有例如:room 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) 
Run Code Online (Sandbox Code Playgroud)

现在如何删除所有重复?(结果 - >

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

#child:author, parent:book
Run Code Online (Sandbox Code Playgroud)

我尝试了几件事,但似乎没有一件事能够完全发挥作用.你能帮助我吗?

Gar*_*tty 5

我假设你在那里上课的不是实际的课(因为它没有价值),但你在这里做的最简单的事 - 假设你的元素的顺序对你来说无关紧要,就是将您的列表设置为一个集合,这将删除所有重复项.

>>> a = ["test", "test", "something", "else"]
>>> a
['test', 'test', 'something', 'else']
>>> set(a)
{'test', 'something', 'else'}
Run Code Online (Sandbox Code Playgroud)

这里我使用了字符串,但您可以使用任何提供相等运算符和哈希函数的类.等于函数用于检查两个类是否相同(对于自定义类,您需要定义它),并且使用散列来使集合非常有效.提供相同哈希的两个类必须相同.你可以有两个具有相同散列的类不相同(它将回退到相等运算符),但发生的越多,它就越慢.通常,使用用于检查相等性的类的组件的哈希值的总和是生成适当哈希的好方法.

所以,例如:

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)+")"
Run Code Online (Sandbox Code Playgroud)

我们可以像以前一样使用这个类.

>>> 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')}
Run Code Online (Sandbox Code Playgroud)

如果您确实关心元素的顺序,即使在删除重复项后,您也可以这样做:

def remove_duplicates_preserving_order(seq):
    seen = set()
    return [ x for x in seq if x not in seen and not seen.add(x)]
Run Code Online (Sandbox Code Playgroud)

这可以通过稍微破解词典理解 - set.add()总是返回0,因此你可以检查它是否为假(它总是会)将元素添加到集合中.

编辑更新:

请注意,PEP-8建议使用CapWords类和lowercase_with_underscores局部变量.

您似乎对Python类的工作方式存在误解.这个类没有多大意义,因为它们都是类属性,而不是实例属性.这意味着它们对于类的所有实例都是相同的,这不是你想要的.这意味着当您第二次更改它们时,您将为所有实例更改它们,使它们完全相同.

要创建实例变量(你想要的类型)你想在构造函数(__init__())中创建它们- 检查我的示例类,看看它是如何工作的.完成此操作后,您需要实现__eq__()__hash__() 运行,以便Python知道您的类的两个项目是否相等意味着什么.然后,您可以使用我上面描述的方法(一组或我给出的函数)来删除重复项.

请注意,如果这是您希望对数据进行的所有操作,则类可能过度.如果你总是要有两个项目,你可以使用一个元组:

>>> a = [("Book", "Author"), ("Book", "Author"), ("OtherBook", "OtherAuthor")] 
>>> set(a)
{('Book', 'Author'), ('OtherBook', 'OtherAuthor')}
Run Code Online (Sandbox Code Playgroud)

因为元组已经为你定义了相等的部分之和.

总的来说,你似乎缺乏对如何在Python中构造和使用类的理解 - 我建议你先阅读并学习如何在其他任何事情之前使用它们,因为不这样做会导致很多问题.