简体   繁体   中英

Using a python api that stores a dict in a list of dicts…with no key values

The python API (gmusicapi) stores playlists as a list of dicts with the track info as a dict inside that dict.

-edit- this is wrong. it does have some sort of key when printed, but I cant find out how to access the keys within the dict.

list = [
    { ##this dict isn't a problem, I can loop through the list and access this.
    'playlistId': '0xH6NMfw94',
    'name': 'my playlist!',
    {'trackId': '02985fhao','album': 'pooooop'}, #this dict is a problem because it has no key name. I need it for track info
    'owner': 'Bob'
    },

    { ##this dict isn't a problem, I can loop through the list and access this.
    'playlistId': '2xHfwucnw77',
    'name': 'Workout',
    'track':{'trackId': '0uiwaf','album': 'ROOOCKKK'}, #this dict would probably work
    'owner': 'Bob'
    }
]

I have tried using for loops and accessing it through somethings like:

def playLists(self):
    print 'attempting to retrieve playlist song info.'
    playListTemp = api.get_all_user_playlist_contents()
    for x in range(len(playListTemp)):
        tempdictionary = dict(playListTemp[x])

The problem here is tempdictionary has a dict in it called tracks but I can't seem to access the keys/value pairs inside it no matter what I do.

when printed it returns something like:

[u'kind', u'name', u'deleted', u'creationTimestamp', u'lastModifiedTimestamp', u'recentTimestamp', u'shareToken', 'tracks', u'ownerProfilePhotoUrl', u'ownerName', u'accessControlled', u'type', u'id', u'description']

where 'tracks' is a dict containing artist, title, tracknumber etc

I also tried something like:

tempdictionary['tracks'][x]['title'] with no luck. Other times I have tried creating a new dict with tracks dict as a velue but then I get an error saying it needs a value of 2 and it found something like 11 etc.

im new to python so if anyone here could help with this I would be very thankful

it does have some sort of key when printed, but I cant find out how to access the keys within the dict.

Iterate over the dict:

for key in dct:
    print(key)
    # or do any number of other things with key

If you'll also be looking at the values of the dict, use .items() to save yourself a dict lookup:

for key, value in dct.items():
    print(key)
    print(value)

You might consider using classes to encapsulate common traits. Currently, each of your track and playlist dictionaries have a lot of duplicate code (ie. "track_id=", "owner="Bob"). Using classes reduces duplicate and makes your meaning more obvious and explicit.

class AudioTrack(object):
    def __init__(self, ID, album=None):
        self.id = ID
        self.album = album
        self.owner = 'Bob'

Create a single AudioTrack objects like this:

your_first_track = AudioTrack('02985fhao', 'pooooop')

Or create a list of AudioTrack objects like this:

your_tracks = [
    AudioTrack("0x1", album="Rubber Soul"),
    AudioTrack("0x2", album="Kind of Blue"),
    ...
    ]

In this way, you could inspect each AudioTrack object:

your_first_track.id     #Returns '02985fhao'

Or do something for all AudioTrack objects in your_tracks:

#Prints the album of every track in the list of AudioTrack intances
for track in your_tracks:
    print track.album

You might make playlists using dictionaries where:

my_playlist = {
    id: "0x1",
    name: "my playlist",
    tracks:  [AudioTrack("0x1", album="Rubber Soul"),
              AudioTrack("0x2", album="Kind of Blue")]
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM