2014-10-04 2 views
2

Я пытаюсь выяснить, как «объединить» два объекта вместе. Моя цель здесь состоит в том, чтобы объединить два объекта Album (код ниже). Мне нужно объединить аргумент tracks (которые являются списками) нескольких объектов Album, только если аргумент 'title' объекта Album тот же.«Слияние» двух объектов в 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

+0

@ Kasra Если список 'tracks' альбома Album 1' '' '' '' '' '' ', а список' tracks 'альбома 2 объекта альбома' ['two'] ', то окончательный список' tracks' будет '['one' , 'two'] '. Я помещаю эту информацию, потому что мне не нужны только длины двух добавленных списков, я хочу, чтобы элементы были добавлены в новый список. –

+0

Я добавляю ответ! – Kasramvd

ответ

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

I я предполагаю, что вы объедините треки альбомов только в том случае, если исполнители и заголовок совпадают. Один из способов сделать это, определив собственную функцию слияния, как показано ниже:

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 должны содержать слитые дорожки. Вам нужно внести другие изменения по своему желанию.

Смежные вопросы