使用列表和字典

时间:2017-04-07 18:25:51

标签: python list python-3.x

我有一个清单:

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

更确切地说,我需要按专辑分组曲目。有什么想法让这很容易吗?

1 个答案:

答案 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)

https://repl.it/HA48/2

正如@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)

https://repl.it/HA48/1