0

我有

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

在 listPar 我有这些课程的列表(对不起,我不确定它是否被称为 class,是吗?)所以在 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) 

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

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

#child:author, parent:book

我已经尝试了几件事,但它们似乎都没有完全起作用..你能帮帮我吗?

4

1 回答 1

5

我假设您在那里提供的课程不是实际的课程(因为它毫无价值),但是您在这里做的最简单的事情 - 假设您的元素的顺序对您来说并不重要,是将您的列表设置为一组,这将删除所有重复项。

>>> 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')}

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

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,所以你可以检查它是否为假(它总是会)以将元素添加到集合中。

编辑更新:

请注意,PEP-8建议使用CapWordsfor 类和lowercase_with_underscores本地变量。

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

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

请注意,如果这就是您希望对数据执行的全部操作,那么类可能会过大。如果你总是有两个项目,你可以只使用一个元组:

>>> a = [("Book", "Author"), ("Book", "Author"), ("OtherBook", "OtherAuthor")] 
>>> set(a)
{('Book', 'Author'), ('OtherBook', 'OtherAuthor')}

由于元组已经将相等定义为它们部分的总和。

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

于 2012-04-25T09:46:18.523 回答