2017-04-07 59 views
0

的工作,我有一個列表:與列表和字典

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

更確切地說,我的專輯需要組軌道。任何想法使這容易嗎?

+3

你嘗試過什麼不工作適合你?我們通常希望你在尋求幫助之前自己編寫一些代碼。 – Prune

+1

當你這樣做時,看看** groupby **函數。 – Prune

+0

https://docs.python.org/3/library/itertools.html#itertools.groupby – wwii

回答

1

1-襯墊:)

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

+1

非常感謝,你簡直就是編程之神 – Aaron