【问题标题】:Python accessing dictionaries within large list - Unofficial GoogleMusicAPIPython 访问大列表中的字典 - 非官方 GoogleMusicAPI
【发布时间】:2014-04-10 22:18:46
【问题描述】:

python 新手,还在学习!不过,我会一直在学习!

我有这么多字典。这些词典是通过非官方的 google music api 生成的,更具体地说,是下面链接中的 .py 文件。

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

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

我在这里尝试了所有可以找到相关性的方法,但无法弄清楚如何访问其中的字典。每首歌都是一本字典。这些是我想做的事情:

  1. 从每个 字典。例如,下面粗体“评论”的第一个键有 没有钥匙,所以我会删除它。

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

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

{
    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'
} 

每个字典都有基本相同的键,因此它们在任何情况下都不是列表唯一的。

对不起,不够简洁!无论如何感谢您的宝贵时间!

【问题讨论】:

  • u 前缀表示这些是 unicode 字符串,它根本不应该影响字典。
  • 这对于我迄今为止尝试删除特定密钥对或访问每个字典中的特定密钥的一切都更有意义。当我尝试前面提到的一些事情时,有时会收到一个错误,指出它不是字符串。也许是因为它的类型实际上是 unicode?我尝试过使用 pop() 函数、del 运算符 (?) 和 re.sub() 等。谢谢马特。
  • 您能否重新表述“随意访问特定的键值,以便我可以编写解析器,或者组织它们以便我可以处理信息。例如,假设我想提取 playCount,艺术家姓名等在此处的 python 教程中徒劳地解析和绘制图形......”请。
  • 在我尝试过的多种方法中,这个错误出现在我身上最多:TypeError: list indices must be integers, not str
  • 另外,根据您的错误,您应该真正阅读文档。使用整数访问列表和元组的元素。字典中的元素——键值对的值部分——通过字符串访问,这就是键。在上面的字典中,键是artistId、rating 等。基本上是左边的键。

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


【解决方案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

它将删除任何具有非真实值的项目,例如 0 和 u''。如果您只希望它删除空字符串,则使其成为更明确的测试:

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

【讨论】:

  • 小心字典理解中的if v,它将删除0 的值,这可能是理想的也可能不是理想的。
  • +1:很好的解释,尤其是在更新if v问题之后。
【解决方案2】:

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)

您可以根据您对“无价值”的确切定义,适当地更改ifs;我已经假设了 u'' 的任何内容(即空字符串)。

2。从每个字典的特定键中获取信息

我仍然有点不确定这里的确切要求。

假设您想浏览所有字典并获得所有播放次数的列表,那么:

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

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

【讨论】:

  • 我将同时做 Matthews 和您的解决方案,只是为了学会让两者都工作。尝试你的方法,我得到这个错误。 AttributeError: 'list' object has no attribute 'items' 这是代码的 sn-p。 songs = api.get_all_songs() new_song_info = {key : songs[key] for key in songs.items() if songs[key] != u''} out = open('songs4.txt', 'w') out.write("%r \n" % songs) 我似乎无法在 cmets 中正确使用“code”降价(?)
  • 第一个问题的答案是“字典(然后可以应用于每个字典)”。因此,您需要遍历列表元素并执行您已完成的操作。我会把答案改得更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多