Разбор из списка в python

Я только что закончил некоторые онлайн-уроки, и я экспериментировал с Discogs Api

Мой код выглядит следующим образом:

import discogs_client as discogs

discogs.user_agent = '--' #i removed it 

artist_input = raw_input("Enter artist\'s name : ")
artist = discogs.Artist(artist_input)

if artist._response.status_code in (400, 401, 402, 403, 404):
    print "Sorry, this artist %s does not exist in Discogs database" % (artist_input)
elif artist._response.status_code in (500, 501, 502, 503) :  
    print "Server is a bit sleepy, give it some time, won\'t you ._."
else:
        print "Artist : " + artist.name
        print "Description : " + str(artist.data["profile"])
        print "Members :",
        members = artist.data["members"]
        for index, name in enumerate(members):
            if index == (len(members) - 1):
                print name + "."
            else:    
                print name + ",",

Формат списка, с которым я хочу работать, выглядит следующим образом:

[<MasterRelease "264288">, <MasterRelease "10978">,  <Release "4665127">...

Я хочу изолировать тех с MasterRelease, чтобы я мог получить их идентификаторы

Я пробовал что-то вроде

for i in artist.releases:
        if i[1:7] in "Master":
            print i

или же

for i in thereleases:
        if i[1:7] == "Master":
       print i

Я, конечно, что-то упускаю, но это пугает меня, так как я могу это сделать

newlist = ["<abc> 43242"]
print newlist[0][1]  

и в этом сценарии

thereleases = artist.releases    
print thereleases[0][1]

я получил

TypeError: 'MasterRelease' object does not support indexing

Не стесняйтесь указывать что-нибудь о коде, так как у меня пока ограниченные знания Python.

3 ответа

Решение

Вы смотрите на Python представление объектов, а не строк. Каждый элемент в списке является экземпляром MasterRelease учебный класс.

Эти объекты имеют id атрибут, просто обратитесь к атрибуту напрямую:

for masterrelease in thereleases:
    print masterrelease.id

Другие атрибуты .versions для других релизов, .title за название релиза и т. д.

Проблема в том, что вы работаете с объектами и предполагаете, что они являются строками. artist.releases список, содержащий несколько объектов

newlist = ["<abc> 43242"]
print newlist[0][1]

Это работает, потому что newlist - это список, который содержит один элемент, строку. так newlist[0] дает вам строку '<abc> 43242', применение newlist[0][1] получает второй элемент этой строки, то есть 'a',

Но это работает только для объектов, которые поддерживают индексацию. А объекты, с которыми вы работаете, этого не делают. То, что вы видите в списке, является строковым представлением объекта.

Я не могу помочь вам дальше, чем это, потому что я понятия не имею о MasterRelease и Release экземпляры - но в них должен быть какой-то атрибут, который возвращает вам требуемое значение.

Если это только MasterRelease что вы хотите отфильтровать, то код ниже может сделать:

[master for master in artist.releases if 'MasterRelease' in str(type(master))]

Если предположить, MasterRelease не в текущем объеме. Или вы могли бы:

[master for master in artist.releases if isinstance(master, MasterRelease)]

Другие вопросы по тегам