我有一个清单:
list = [
{'album': '1', 'artist': 'pedro', 'title': 'Duhast'},
{'album': '2', 'artist': 'hose', 'title':'Star boy'},
{'album': '1', 'artist': 'migel', 'title': 'Lemon tree'}
]
我需要像这样对这个列表进行分组/排序:
list = [
{'album': '1',
'tracks': [
{'artist': 'pedro', 'title': 'Duhast'},
{'artist': 'migel', 'title': 'Lemon tree'}]
},
{'album': '2',
'tracks':[
{'artist': 'hose', 'title':'Star boy'}]
}
]
更确切地说,我需要按专辑分组曲目。有什么想法让这很容易吗?
答案 0 :(得分:1)
1-liner:)
from itertools import groupby
list = [{'album': '1', 'artist': 'pedro', 'title': 'Duhast'}, {'album': '2', 'artist': 'hose', 'title':'Star boy'}, {'album': '1', 'artist': 'migel', 'title': 'Lemon tree'}]
res = [{'album': album, 'tracks': [{'artist': track['artist'], 'title': track['title']} for track in tracks]} for album, tracks in groupby(sorted(list, key=lambda x: x['album']), lambda x: x['album'])]
print(res)
正如@Prune所提到的,groupby
函数可用于按指定的键函数对列表进行分组。为了使其工作,列表必须按键排序。
就个人而言,我发现上面的解决方案有点难以阅读......这给出了相同的结果:
from itertools import groupby
list = [{'album': '1', 'artist': 'pedro', 'title': 'Duhast'}, {'album': '2', 'artist': 'hose', 'title':'Star boy'}, {'album': '1', 'artist': 'migel', 'title': 'Lemon tree'}]
res = []
for album, tracks in groupby(sorted(list, key=lambda x: x['album']), lambda x: x['album']):
res.append({'album': album, 'tracks': [{'artist': track['artist'], 'title': track['title']} for track in tracks]})
print(res)