Разбор из списка в 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)]