Python - 创建循环遍历嵌套列表的字典列表

时间:2017-08-28 19:26:20

标签: python dictionary

我有这个列表清单:

music = [[u'Charles Bradley', u'Heart of Gold'], [u'Charles Bradley', u'Stay Away'], [u'Iron & Wine', u'Pagan Angel And A Borrowed Car'], [u'Iron & Wine', u'White Tooth Man'], [u'Iron & Wine', u'Lovesong of the Buzzard'], [u'Iron & Wine', u'Carousel'], [u'Iron & Wine', u'House By The Sea'], [u'Iron & Wine', u'Innocent Bones'], [u'Iron & Wine', u"Wolves (Song of the Shepherd's Dog)"], [u'Iron & Wine', u'Resurrection Fern'], [u'Iron & Wine', u'Boy With a Coin'], [u'Iron & Wine', u'The Devil Never Sleeps'], [u'Iron & Wine', u'Peace Beneath The City'], [u'Iron & Wine', u'Flightless Bird, American Mouth'], [u'Animal Collective', u'In the Flowers'], [u'Animal Collective', u'My Girls'], [u'Animal Collective', u'Also Frightened'], [u'Animal Collective', u'Summertime Clothes'], [u'Animal Collective', u'Daily Routine'], [u'Animal Collective', u'Bluish'], [u'Animal Collective', u'Guys Eyes'], [u'Animal Collective', u'Taste'], [u'Animal Collective', u'Lion in a Coma'], [u'Animal Collective', u'No More Runnin'], [u'Animal Collective', u'Brother Sport'], [u'Richard Hawley', u'I Still Want You'], [u'Richard Hawley', u'The World Looks Down'], [u'Richard Hawley', u'Which Way'], [u'Richard Hawley', u'Serenade Of Blue'], [u'Richard Hawley', u'Long Time Down'], [u'Richard Hawley', u'Nothing Like A Friend'], [u'Richard Hawley', u'Sometimes I Feel'], [u'Richard Hawley', u'Tuesday pm'], [u'Richard Hawley', u'Welcome The Sun'], [u'Richard Hawley', u'Heart Of Oak'], [u'Richard Hawley', u'What Love Means'], [u'Suuns', u'Powers of Ten'], [u'Suuns', u'2020'], [u'Suuns', u'Minor Work'], [u'Suuns', u'Mirror Mirror'], [u'Suuns', u"Edie's Dream"], [u'Suuns', u'Sunspot'], [u'Suuns', u'Bambi'], [u'Suuns', u'Holocene City'], [u'Suuns', u'Images du Futur'], [u'Suuns', u"Music Won't Save You"], [u'Deerhunter', u'Earthquake'], [u'Deerhunter', u'Don\u2019t Cry'], [u'Deerhunter', u'Revival'], [u'Deerhunter', u'Sailing'], [u'Deerhunter', u'Memory Boy'], [u'Deerhunter', u'Desire Lines'], [u'Deerhunter', u'Basement Scene'], [u'Deerhunter', u'Helicopter'], [u'Deerhunter', u'Fountain Stairs'], [u'Deerhunter', u'Coronado'], [u'Deerhunter', u'He Would Have Laughed'], [u'Animal Collective', u'FloriDada'], [u'Animal Collective', u'Hocus Pocus'], [u'Animal Collective', u'Vertical'], [u'Animal Collective', u'Lying in the Grass'], [u'Animal Collective', u'The Burglars'], [u'Animal Collective', u'Natural Selection'], [u'Animal Collective', u'Bagels in Kiev'], [u'Animal Collective', u'On Delay'], [u'Animal Collective', u'Spilling Guts'], [u'Animal Collective', u'Summing the Wretch'], [u'Animal Collective', u'Golden Gal'], [u'Animal Collective', u'Recycling'], [u'Elvis Costello & The Attractions', u'Uncomplicated'], [u'Elvis Costello & The Attractions', u"I Hope You're Happy Now"], [u'Elvis Costello & The Attractions', u'Tokyo Storm Warning'], [u'Elvis Costello & The Attractions', u'Home Is Anywhere You Hang Your Head'], [u'Elvis Costello & The Attractions', u'I Want You'], [u'Elvis Costello & The Attractions', u'Honey Are You Straight Or Are You Blind'], [u'Elvis Costello & The Attractions', u'Blue Chair'], [u'Elvis Costello & The Attractions', u'Battered Old Bird'], [u'Elvis Costello & The Attractions', u'Crimes Of Paris'], [u'Elvis Costello & The Attractions', u'Poor Napoleon'], [u'Elvis Costello & The Attractions', u'Next Time Round']]

我希望最终得到一个词典列表,其中每个独特的艺术家都是key,其曲目列表是value,如下所示:

dicts = [{'Charles Bradley: ['Heart of Gold', 'Stay Away']}, ...]]

为此,我来到这里:

artists = set()
dicts=[]

for item in music:
    artists.add(item[0])
    for artist in artists:
        if artist in item:
            dicts[artist]=item[1]

这显然不够远,因为我得到了:

{u'Suuns': u"Music Won't Save You", u'Animal Collective': u'Recycling', u'Iron & Wine': u'Flightless Bird, American Mouth', u'Deerhunter': u'He Would Have Laughed', u'Charles Bradley': u'Stay Away', u'Elvis Costello & The Attractions': u'Next Time Round', u'Richard Hawley': u'What Love Means'}

任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:3)

您可以使用defaultdict

from collections import defaultdict

d = defaultdict(list)

for artist, song in music:
   d[artist].append(song)

full_list = [{a:b} for a, b in d.items()]

输出:

[{u'Suuns': [u'Powers of Ten', u'2020', u'Minor Work', u'Mirror Mirror', u"Edie's Dream", u'Sunspot', u'Bambi', u'Holocene City', u'Images du Futur', u"Music Won't Save You"]}, {u'Animal Collective': [u'In the Flowers', u'My Girls', u'Also Frightened', u'Summertime Clothes', u'Daily Routine', u'Bluish', u'Guys Eyes', u'Taste', u'Lion in a Coma', u'No More Runnin', u'Brother Sport', u'FloriDada', u'Hocus Pocus', u'Vertical', u'Lying in the Grass', u'The Burglars', u'Natural Selection', u'Bagels in Kiev', u'On Delay', u'Spilling Guts', u'Summing the Wretch', u'Golden Gal', u'Recycling']}, {u'Iron & Wine': [u'Pagan Angel And A Borrowed Car', u'White Tooth Man', u'Lovesong of the Buzzard', u'Carousel', u'House By The Sea', u'Innocent Bones', u"Wolves (Song of the Shepherd's Dog)", u'Resurrection Fern', u'Boy With a Coin', u'The Devil Never Sleeps', u'Peace Beneath The City', u'Flightless Bird, American Mouth']}, {u'Deerhunter': [u'Earthquake', u'Don\u2019t Cry', u'Revival', u'Sailing', u'Memory Boy', u'Desire Lines', u'Basement Scene', u'Helicopter', u'Fountain Stairs', u'Coronado', u'He Would Have Laughed']}, {u'Charles Bradley': [u'Heart of Gold', u'Stay Away']}, {u'Elvis Costello & The Attractions': [u'Uncomplicated', u"I Hope You're Happy Now", u'Tokyo Storm Warning', u'Home Is Anywhere You Hang Your Head', u'I Want You', u'Honey Are You Straight Or Are You Blind', u'Blue Chair', u'Battered Old Bird', u'Crimes Of Paris', u'Poor Napoleon', u'Next Time Round']}, {u'Richard Hawley': [u'I Still Want You', u'The World Looks Down', u'Which Way', u'Serenade Of Blue', u'Long Time Down', u'Nothing Like A Friend', u'Sometimes I Feel', u'Tuesday pm', u'Welcome The Sun', u'Heart Of Oak', u'What Love Means']}]

答案 1 :(得分:2)

from collections import defaultdict

d = defaultdict(list)
songs = [[u'Charles Bradley', u'Heart of Gold'], [u'Charles Bradley', u'Stay Away'], [u'Iron & Wine', u'Pagan Angel And A Borrowed Car'], [u'Iron & Wine', u'White Tooth Man'], [u'Iron & Wine', u'Lovesong of the Buzzard'], [u'Iron & Wine', u'Carousel'], [u'Iron & Wine', u'House By The Sea'], [u'Iron & Wine', u'Innocent Bones'], [u'Iron & Wine', u"Wolves (Song of the Shepherd's Dog)"], [u'Iron & Wine', u'Resurrection Fern'], [u'Iron & Wine', u'Boy With a Coin'], [u'Iron & Wine', u'The Devil Never Sleeps'], [u'Iron & Wine', u'Peace Beneath The City'], [u'Iron & Wine', u'Flightless Bird, American Mouth'], [u'Animal Collective', u'In the Flowers'], [u'Animal Collective', u'My Girls'], [u'Animal Collective', u'Also Frightened'], [u'Animal Collective', u'Summertime Clothes'], [u'Animal Collective', u'Daily Routine'], [u'Animal Collective', u'Bluish'], [u'Animal Collective', u'Guys Eyes'], [u'Animal Collective', u'Taste'], [u'Animal Collective', u'Lion in a Coma'], [u'Animal Collective', u'No More Runnin'], [u'Animal Collective', u'Brother Sport'], [u'Richard Hawley', u'I Still Want You'], [u'Richard Hawley', u'The World Looks Down'], [u'Richard Hawley', u'Which Way'], [u'Richard Hawley', u'Serenade Of Blue'], [u'Richard Hawley', u'Long Time Down'], [u'Richard Hawley', u'Nothing Like A Friend'], [u'Richard Hawley', u'Sometimes I Feel'], [u'Richard Hawley', u'Tuesday pm'], [u'Richard Hawley', u'Welcome The Sun'], [u'Richard Hawley', u'Heart Of Oak'], [u'Richard Hawley', u'What Love Means'], [u'Suuns', u'Powers of Ten'], [u'Suuns', u'2020'], [u'Suuns', u'Minor Work'], [u'Suuns', u'Mirror Mirror'], [u'Suuns', u"Edie's Dream"], [u'Suuns', u'Sunspot'], [u'Suuns', u'Bambi'], [u'Suuns', u'Holocene City'], [u'Suuns', u'Images du Futur'], [u'Suuns', u"Music Won't Save You"], [u'Deerhunter', u'Earthquake'], [u'Deerhunter', u'Don\u2019t Cry'], [u'Deerhunter', u'Revival'], [u'Deerhunter', u'Sailing'], [u'Deerhunter', u'Memory Boy'], [u'Deerhunter', u'Desire Lines'], [u'Deerhunter', u'Basement Scene'], [u'Deerhunter', u'Helicopter'], [u'Deerhunter', u'Fountain Stairs'], [u'Deerhunter', u'Coronado'], [u'Deerhunter', u'He Would Have Laughed'], [u'Animal Collective', u'FloriDada'], [u'Animal Collective', u'Hocus Pocus'], [u'Animal Collective', u'Vertical'], [u'Animal Collective', u'Lying in the Grass'], [u'Animal Collective', u'The Burglars'], [u'Animal Collective', u'Natural Selection'], [u'Animal Collective', u'Bagels in Kiev'], [u'Animal Collective', u'On Delay'], [u'Animal Collective', u'Spilling Guts'], [u'Animal Collective', u'Summing the Wretch'], [u'Animal Collective', u'Golden Gal'], [u'Animal Collective', u'Recycling'], [u'Elvis Costello & The Attractions', u'Uncomplicated'], [u'Elvis Costello & The Attractions', u"I Hope You're Happy Now"], [u'Elvis Costello & The Attractions', u'Tokyo Storm Warning'], [u'Elvis Costello & The Attractions', u'Home Is Anywhere You Hang Your Head'], [u'Elvis Costello & The Attractions', u'I Want You'], [u'Elvis Costello & The Attractions', u'Honey Are You Straight Or Are You Blind'], [u'Elvis Costello & The Attractions', u'Blue Chair'], [u'Elvis Costello & The Attractions', u'Battered Old Bird'], [u'Elvis Costello & The Attractions', u'Crimes Of Paris'], [u'Elvis Costello & The Attractions', u'Poor Napoleon'], [u'Elvis Costello & The Attractions', u'Next Time Round']]
for artist, title  in songs:
    d[artist].append(title)

print(d)

答案 2 :(得分:1)

没有defaultdict的替代方案:

dicts = {}

for key, value in music:
    if key not in dicts:
        dicts[key] = []
    dicts[key].append(value) 

之后,您可以使用@ Ajax1234的full_list方法。

答案 3 :(得分:0)

我认为你做的工作太多了。该套装确实没有必要,因为您可以通过" in"来检查密钥是否在字典中。关键词。如果我是你,我会找艺术家,检查艺术家是否在字典中,如果是,请将其添加到该艺术家的歌曲列表中。

for item in music:
    artistExists=False
    for dict in dicts:
        if item[0] in dict:
            dict[item[0]].append(item[1])
            artistExists=True
            break
    if not artistExists:
        dict.append({item[0]: [item[1]]})

(defaultdict在这里工作得很好,但我想在没有它的情况下提供答案)

旁注,你为什么要特别想要一个dicts列表?当使用单个字典完成时,这可以更容易理解,创建和实现。

dict={}
for item in music:
    if item[0] not in dict:
        dict[item[0]] = []
    dict[item[0]].append(item[1])      

哪会让你:

{'Charles Bradley': ['Heart of Gold', 'Stay Away'], 'Iron & Wine': ['Lovesong of the Buzzard', 'White Tooth Man'], ...}