Python访问大型列表中的字典 - 非官方GoogleMusicAPI

时间:2014-04-10 22:18:47

标签: python list python-2.7 dictionary google-music

蟒蛇新手,还在学习!虽然,我会一直在学习!

我有这么多的词典。这些词典是通过非官方的谷歌音乐API生成的,更具体地说,是下面链接中的.py文件。

https://github.com/simon-weber/Unofficial-Google-Music-API/blob/develop/gmusicapi/clients/mobileclient.py

我使用函数get_all_songs并创建列表。我已成功将数据输出到文本文件。该函数声明它创建了一个很大的字典列表。

我已经尝试了我能找到相关的每个方法,并且无法弄清楚如何访问其中的词典。每首歌都是字典。这些是我想要做的事情:

  1. 删除每个都没有值的内容的密钥对 字典。例如,下面的第一个键以粗体'评论'具有 没有钥匙所以我会删除它。

  2. 从每个字典中获取特定键的信息。例如,从每首歌曲(每个字典)中取出艺术家值和播放计数值,并且能够播放"用它。就像添加特定艺术家的每首歌的所有播放次数一样。 http://newcoder.io/Part-2-Graph/

  3. 这是我从函数创建的文本文件中提取的字典。此外,我不知道为什么在每个键和值之前有(u')或(u")。我相信它只是通过API捕获的信息的一部分。我有预感,那些人正在搞乱字典的结构。但我可能完全错了。

    {
        u'comment': u'', 
        u'rating': u'0', 
        u'artistId': [u'Amicfexiiup7erm7exmzdyimive'], 
        u'composer': u'', 
        u'year': 0, 
        u'creationTimestamp': u'1395972652473326', 
        u'id': u'e6c27479-1d7d-37a6-a788-52bcb8477e42', 
        u'album': u'', 
        u'totalDiscCount': 0, 
        u'title': u"Chromeo - Jealous (I Ain't With It) (The Chainsmokers Remix).mp3",
        u'recentTimestamp': u'1395972654776000', 
        u'albumArtist': u'', 
        u'trackNumber': 0, 
        u'discNumber': 0, 
        u'deleted': False, 
        u'storeId': u'Tshltra3tgk3q6ktjdxgxjtljky', 
        u'nid': u'Tshltra3tgk3q6ktjdxgxjtljky', 
        u'totalTrackCount': 0, 
        u'estimatedSize': u'3662316', 
        u'albumId': u'B4fo7oogd5ka2jfhlddjwazivlm', 
        u'beatsPerMinute': 0, 
        u'genre': u'', 
        u'playCount': 21, 
        u'artistArtRef': [{u'url': u'REMOVED LINK BECAUSE STACKOVERFLOW LIMIT'}], 
        u'kind': u'sj#track', 
        u'artist': u'Chromeo', 
        u'lastModifiedTimestamp': 
        u'1396305526006069', 
        u'clientId': u'9gG999dOb6DKkkGTcw/9GQ', 
        u'durationMillis': u'229000'
    } 
    

    每个字典都有基本相同的键,因此它们对列表并不是唯一的。

    抱歉缺乏简洁!非常感谢你的时间!

2 个答案:

答案 0 :(得分:1)

当您致电get_all_songs时,会返回词典列表。您可以像这样单步执行列表:

songs = client.get_all_songs()
for song in songs:
    ...

每次循环时,它会从列表中提取一个连续的字典并将其分配给song

要清除字典中的空键,您可以仅使用具有非空值的键/值对创建一个新键:

clear_song = {k:v for (k,v) in song.iteritems() if v}

这是字典理解,它几乎相当于:

clear_song = dict()
for key, value in song.iteritems():
    if value:
        clear_song[key] = value

它会移除任何具有非Truthy值的项目,例如0u''。如果您只想删除空字符串,那么请进行更明确的测试:

clear_song = {k:v for (k,v) in song.iteritems() if v.strip() != u''}

要逐步浏览所有歌曲并制作清晰的歌曲,您可以将其添加到上面的for循环中,或者您可以在单个列表理解中完成所有操作:

clear_songs = [
    {k:v for (k,v) in song.iteritems() if v}
    for song in songs
]

要访问特定字典,您需要知道它在列表中的位置:

clear_songs[77]['title'] # get the title of the 78th song in the list

或者您可以使用filter查找匹配的词典:

filter(lambda x: x['title'] == "Chromeo - Jealous (I Ain't With It) (The Chainsmokers Remix).mp3", clear_songs)['estimatedSize'] # return '3662316'

你可以把它推到一个方便的功能:

def find_song(key, value, songs):
    return filter(lambda x: x[key] == value, songs)

并通过以下方式致电:

find_song('title', 'Chromeo - Jealous ...', clear_songs) # will return the matching dict

答案 1 :(得分:0)

<强> 1。从词典中删除其值中没有任何内容的密钥对

为此,您可以对当前字典进行更改(删除),也可以使用感兴趣的键/值对创建新字典。

要改变当前字典,假设它被称为song_info

songs = client.get_all_songs()
for song in songs:   
    for key, value in song.items():
        if value == u'':
            del song[key]

使用感兴趣的键/值对创建新词典:

songs = client.get_all_songs()
songs_without_empty_values = []
for song in songs:
    new_song_info = {key : song[key]
                     for key in song.items()
                     if song[key] != u''}
    songs_without_empty_values.append(new_song_info)

您可以根据您对“无价值”的定义进行适当更改if。是;我假设u''(即空字符串)。

<强> 2。从每个词典中的特定键中获取信息

我仍然不确定这里的具体要求。

假设您想浏览所有词典并获得所有游戏计数的列表,那么:

songs = client.get_all_songs()
key = u'playCount'
values = [song[key] for song in songs]

请注意,上面的代码非常简单,如果KeyError不在字典中,则不会考虑引发的key