删除列表python中的类似对象

时间:2014-10-05 03:24:49

标签: python list object duplicates

我在Album中有一堆list个对象(下面发布的对象的代码)。确切地说是5570。但是,在查看唯一对象时,我应该有385.由于创建对象的方式(我不知道我是否可以正确解释),我认为最好将所有对象添加到列表中,然后删除之后相似的那些。

某些对象对每个参数都有相同的字符串(artisttitletracks),我想摆脱它们。但是,我知道我不能简单地删除重复项,因为它们存储在不同的内存位置,因此不完全相同。

任何人都可以帮我删除重复项吗?

你可能会说,我对python很新。

提前致谢!

class Album(object) :
    def __init__(self, artist, title, tracks = None) :
        tracks = []
        self.artist = artist
        self.title = title
        self.tracks = tracks

    def add_track(self, track) :
        self.track = track
        (self.tracks).append(track)
        print "The track %s was added." % (track)

    def __str__(self) :
        return "Artist: %s, Album: %s [" % (self.artist, self.title) + str(len(self.tracks)) + " Tracks]"

2 个答案:

答案 0 :(得分:0)

您可以将您的课程hashable设置为元组(artist, title, tracks),并将对象存储在set中,这样只保留唯一的对象。

答案 1 :(得分:0)

虽然other answer解决了删除重复项的根本问题,但它不允许您保留Album类,这可能在将来(甚至现在通过其__str__方法)。因此,我认为您应该考虑实施the __eq__ method来比较Album类的对象。实现它的一种方法是along with the __ne__ method,它将是:

def __eq__(self, other):
    # assuming tracks were added in the same order
    return type(other) is self.__class__ and other.artist == self.artist and other.title == self.title and other.tracks == self.tracks

def __ne__(self, other):
    return not self.__eq__(other)

请注意,显式检查类型而不是测试一个对象是否是另一个类的实例可以使您从dangerous pitfall继承order of equality evaluation,而can be found here不重要(例如the __hash__ method a == bb == a返回不同的值。)

另一种通用解决方案,适用于简单的容器类,例如您拥有的容器类set

def __eq__(self, other):
    return type(other) is self.__class and other.__dict__ == self.__dict__

如果您同时实施a suggested generic implementation,则可以将对象添加到this中,以确保没有重复项。对于像你这样的简单容器类,这里是{{3}}:

def __hash__(self):
    """Override the default hash behavior (that returns the id or the object)"""
    return hash(tuple(sorted(self.__dict__.items())))

您还可以查看{{3}}以了解建议的实施方式。


关于您的代码的一些补充说明:

  1. 如果您使用空列表覆盖它,那么在tracks方法中接受__init__的参数是没有意义的。

  2. self.track方法中设置add_track没有意义,因为它不会在任何地方使用,并且会在add_track的下一次调用中被覆盖。 self.tracks周围也不需要括号。您的方法应如下所示:

    def add_track(self, track) :
        self.tracks.append(track)
        print "The track %s was added." % (track)
    
  3. 您的字符串表示方法需要稍微修改一下。

    def __str__(self) :
        return "Artist: %s, Album: %s [%d tracks]" % (self.artist, self.title, len(self.tracks))