删除多个“;“类”;从python中的列表中
我有 在listPar中,我有一个这些类的列表(对不起,我不确定它是否被称为类,是吗?),所以在listPar中,我有例如:room book;书名;房间登记簿;书名 现在我正试图删除所有非唯一的事件,所以我只想 房间登记簿;listPar中的书名 假设我有以下代码:删除多个“;“类”;从python中的列表中,python,list,duplicates,Python,List,Duplicates,我有 在listPar中,我有一个这些类的列表(对不起,我不确定它是否被称为类,是吗?),所以在listPar中,我有例如:room book;书名;房间登记簿;书名 现在我正试图删除所有非唯一的事件,所以我只想 房间登记簿;listPar中的书名 假设我有以下代码: class rel: child='' parent='' listPar=[] 现在如何删除所有重复项?(结果-> variable="Book" variable2="Author" toIns=rel() to
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)]
因为元组已经将相等定义为它们各部分的总和
总的来说,您似乎不了解类是如何常量的