删除多个“;“类”;从python中的列表中

删除多个“;“类”;从python中的列表中,python,list,duplicates,Python,List,Duplicates,我有 在listPar中,我有一个这些类的列表(对不起,我不确定它是否被称为类,是吗?),所以在listPar中,我有例如:room book;书名;房间登记簿;书名 现在我正试图删除所有非唯一的事件,所以我只想 房间登记簿;listPar中的书名 假设我有以下代码: class rel: child='' parent='' listPar=[] 现在如何删除所有重复项?(结果-> variable="Book" variable2="Author" toIns=rel() to

我有

在listPar中,我有一个这些类的列表(对不起,我不确定它是否被称为类,是吗?),所以在listPar中,我有例如:room book;书名;房间登记簿;书名

现在我正试图删除所有非唯一的事件,所以我只想

房间登记簿;listPar中的书名

假设我有以下代码:

class rel:
   child=''
   parent=''
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
这里我使用字符串,但您可以使用任何提供相等运算符和哈希函数的类。相等函数用于检查这两个类是否相同(对于自定义类,您需要定义它)散列用于使集合非常有效。给出相同散列的两个类必须相同。可以有两个具有相同散列的类,但它们不相同(它将返回到相等运算符),但发生的次数越多,速度就越慢。通常,使用类组件的哈希值之和来检查相等性是生成适当哈希值的好方法

例如:

>>> a = ["test", "test", "something", "else"]
>>> a
['test', 'test', 'something', 'else']
>>> set(a)
{'test', 'something', 'else'}
我们可以像以前一样使用这个类

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')}
这是通过稍微修改字典理解来实现的-
set.add()
始终返回0,因此您可以检查将元素添加到集合中是否为false(始终为false)

编辑以进行更新: 请注意,建议 对类使用
大写字母
,对本地类使用
小写字母加下划线
变量

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

要创建实例变量(您想要的类型),您需要在其中创建它们 构造函数(
\uuuu init\uuuuu()
)-检查我的示例类以了解其工作原理。 完成此操作后,您需要实现
\uuuu eq\uuuu()
\uuu hash\uuuu()
函数,以便Python知道类中的两个项是什么意思 然后,您可以使用我上面描述的方法(集合或函数) 我给了)删除重复项

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

#child:author, parent:book
请注意,如果这是您希望对数据执行的全部操作,那么类可能会被过度使用。 如果总是有两个项,可以使用一个元组:

def remove_duplicates_preserving_order(seq):
    seen = set()
    return [ x for x in seq if x not in seen and not seen.add(x)]
因为元组已经将相等定义为它们各部分的总和


总的来说,您似乎对Python中如何构造和使用类缺乏了解-我建议您先阅读并学习如何使用它们,因为不这样做会给您带来很多问题。

我认为您给出的类不是实际的类(因为它毫无价值),但这里最简单的一件事是——假定元素的顺序对您来说无关紧要,将列表放入一个集合中,这将删除所有重复项

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

#child:author, parent:book
这里我使用字符串,但您可以使用任何提供相等运算符和哈希函数的类。相等函数用于检查这两个类是否相同(对于自定义类,您需要定义它)散列用于使集合非常有效。给出相同散列的两个类必须相同。可以有两个具有相同散列的类,但它们不相同(它将返回到相等运算符),但发生的次数越多,速度就越慢。通常,使用类组件的哈希值之和来检查相等性是生成适当哈希值的好方法

例如:

>>> a = ["test", "test", "something", "else"]
>>> a
['test', 'test', 'something', 'else']
>>> set(a)
{'test', 'something', 'else'}
我们可以像以前一样使用这个类

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')}
这是通过稍微修改字典理解来实现的-
set.add()
始终返回0,因此您可以检查将元素添加到集合中是否为false(始终为false)

编辑以进行更新: 请注意,建议 对类使用
大写字母
,对本地类使用
小写字母加下划线
变量

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

要创建实例变量(您想要的类型),您需要在其中创建它们 构造函数(
\uuuu init\uuuuu()
)-检查我的示例类以了解其工作原理。 完成此操作后,您需要实现
\uuuu eq\uuuu()
\uuu hash\uuuu()
函数,以便Python知道类中的两个项是什么意思 然后,您可以使用我上面描述的方法(集合或函数) 我给了)删除重复项

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

#child:author, parent:book
请注意,如果这是您希望对数据执行的全部操作,那么类可能会被过度使用。 如果总是有两个项,可以使用一个元组:

def remove_duplicates_preserving_order(seq):
    seen = set()
    return [ x for x in seq if x not in seen and not seen.add(x)]
因为元组已经将相等定义为它们各部分的总和

总的来说,您似乎不了解类是如何常量的