2014-10-04 126 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應包含合併的軌道。您需要根據需要進行其他更改。