python新手,仍在学习!虽然,我会一直学习!
我有一大堆字典。这些词典是通过非官方的谷歌音乐api生成的,更具体地说,是通过下面链接中的.py文件生成的。
https://github.com/simon-weber/Unofficial-Google-Music-API/blob/develop/gmusicapi/clients/mobileclient.py
我使用函数get_all_songs
,它会创建列表。我已经成功地将数据输出到一个文本文件中。函数声明它创建了一个大的字典列表。
我在这里尝试了所有我能找到的相关方法,但不知道如何访问其中的词典。每首歌都是一本字典。这些是我想做的事情:
-
从每个词典例如,下面粗体"comment"中的第一个键具有没有钥匙,所以我会把它取下来。
-
从每本字典的特定关键字中获取信息。例如,从每首歌(每本词典)中获取艺术家值和播放次数,然后可以"播放"它。就像添加特定艺术家每首歌的所有播放次数一样。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'
}
每个字典基本上都有相同的关键字,因此它们在列表中无论如何都不是唯一的。
抱歉不够简洁!不管怎样,谢谢你抽出时间!
当您调用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值的项目,如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
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]
请注意,上面的代码非常简单,并且如果key
不在字典中,则它不考虑引发的KeyError
。