2014-10-04 133 views
2

我想弄清楚如何将两个对象合并在一起。我的目标是合并两个Album对象(下面的代码)。只有Album对象的'title'参数相同时,我需要能够合并多个Album对象的tracks参数(它们是列表)。'合并'Python中的两个对象

基本上,如果我有一个Album对象,其中tracks参数的长度为1,并且其他相册对象,其中tracks参数的长度也为1,新的或更新的单数Album对象需要具有tracks参数长度为2.

我已经发布我的代码以显示如何定义对象。

提前致谢!

编辑:因为tracks参数列表中的每个元素都是歌曲的名称,所以我想保留相同的元素并将它们放入新的或更新的tracks参数中。我不需要改变元素的数量,而需要将每个对象的确切元素放入这个“新”对象中。

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) : 
     if len(self.tracks) == 1 : 
      return "Artist: %s, Album: %s [" % (self.artist, self.title) + "1 Track]" 
     return "Artist: %s, Album: %s [" % (self.artist, self.title) + str(len(self.tracks)) + " Tracks]" 
+0

你的意思是'将每个对象的确切元素放入这个'新'对象中。 '? – Kasramvd 2014-10-04 21:08:55

+0

@Kasra如果Album对象1的'tracks'列表是'['one']'而Album对象2的'tracks'列表是'['two']',那么最终的'tracks'列表将会是'['one' ,'two']'。我将这些信息加入,因为我不想只添加两个列表的长度,我想将这些元素添加到新列表中。 – 2014-10-04 21:12:51

+0

我添加了一个答案! – Kasramvd 2014-10-04 21:21:19

回答

2

合并算法必须知道类的内部数据结构。所以,把合并代码放在类里似乎是合乎逻辑的。下面的代码这是否和允许两张专辑被简单地合并增加它们(album1 + album2):

class Album(object) : 
    def __init__(self, artist, title, tracks = None) : 
     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) : 
     if len(self.tracks) == 1 : 
      return "Artist: %s, Album: %s [" % (self.artist, self.title) + "1 Track]" 
     return "Artist: %s, Album: %s [" % (self.artist, self.title) + str(len(self.tracks)) + " Tracks]" 

    def __add__(self, other): 
     if self.artist != other.artist or self.title != other.title: 
      raise ValueError("Albums are incommensurable") 
     return Album(self.artist, self.title, self.tracks + other.tracks) 

这是用来如下:

>>> a = Album('Joe', "Joe's First", tracks=['Beer', 'Trucks']) 
>>> b = Album('Joe', "Joe's First", tracks=['Bourbon', 'Tequila']) 
>>> complete = a + b 
>>> print complete 
Artist: Joe, Album: Joe's First [4 Tracks] 
>>> complete.tracks 
['Beer', 'Trucks', 'Bourbon', 'Tequila'] 
0

关于让你不需要是相同的元素你只需要if条件检查之前加入音轨:

def add_track(self, track) : 
    self.track = track 
    if track not in (self.tracks) : 
     (self.tracks).append(track) 
    else : 
     raise ValueError("duplicate track") 
    print "The track %s was added." % (track) 
0
def merge_albums(album1, album2): 
    if not album1.artist == album2.artist and \ 
      album1.title == album2.title: 
     raise SomeException("Albums don't match") 
    new_tracks = list(set(album1.tracks + album2.tracks)) 
    return Album(album1.artist, album1.title, new_tracks) 
0

我我认为只有在艺术家和标题相同的情况下,你才会合并专辑的曲目。要做到这一点的方法之一是通过如下定义自己的合并功能:

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 merge(self, album): 
     if (type(self)==type(album)): 
      if self.artist == album.artist and self.title==album.title: 
       self.tracks.extend(album.tracks) 
      else: 
       print "cannot merge albums, artists or titles are not same" 
     else: 
      print "Invalid object types, cannot merge" 
    def __str__(self) : 
     if len(self.tracks) == 1 : 
      return "Artist: %s, Album: %s [" % (self.artist, self.title) + "1 Track]" 
     return "Artist: %s, Album: %s [" % (self.artist, self.title) + \ 
       str(len(self.tracks)) + " Tracks]" 

然后,如果你有专辑,你可以调用a.merge(二)合并后a.tracks应包含合并的轨道。您需要根据需要进行其他更改。