【问题标题】:Organising results from JSON file using Python lists?使用 Python 列表组织 JSON 文件的结果?
【发布时间】:2021-03-06 00:35:57
【问题描述】:

我已经解析了一个 JSON 文件,其中包含大约 3000 首歌曲的曲目名称和专辑名称,但尝试将其组织成列表或类似的列表时却一无所获?

我基本上想将这些项目分类到一个唯一专辑列表中,每个专辑都包含一个曲目列表,并且想知道这是否真的可能,因为我不知道如何为列表分配名称?

到目前为止我的代码如下:

import json
from pprint import pprint

with open('.../playlist.json', encoding="utf-8") as f:
    data = json.load(f)

for playlist in data['playlists']:
    if playlist['name'] == 'PLAYLIST3':
        for item in playlist['items']:
            track = item['track']['trackName']
            album = item['track']['albumName']

此外,歌曲没有以任何特定方式排序。

编辑: 这就是我所做的,它似乎在创建一个以歌曲列表为值、专辑名称为键的字典列表时效果很好:

import json
from pprint import pprint

with open('C:/Users/nambi/Desktop/parse/playlist.json', encoding="utf-8") as f:
    data = json.load(f)

listOfAlbums = {}

for playlist in data['playlists']:
    if playlist['name'] == 'P4':
        for item in playlist['items']:
            title = item['track']['trackName']
            album = item['track']['albumName']

            if album in listOfAlbums:
                listOfAlbums[album].append(title)
            else:
                listOfAlbums[album] = [title]

【问题讨论】:

    标签: python json list set


    【解决方案1】:

    您可以只使用 collections.defaultdict 因为它允许设置每个键的值的类型。 在您的情况下,键是专辑名称,值是曲目列表。

    import json
    from collections import defaultdict
    from pprint import pprint
    
    with open('.../playlist.json', encoding="utf-8") as f:
        data = json.load(f)
    
    result = defaultdict(list)
    for playlist in data['playlists']:
        if playlist['name'] != 'PLAYLIST3':
            continue
    
        for item in playlist['items']:
            track = item['track']['trackName']
            album = item['track']['albumName']
            result[album].append(track)
    

    编辑:其他改进:

    import json
    from collections import defaultdict
    from itertools import ifilter
    from pprint import pprint
    
    with open('.../playlist.json', encoding="utf-8") as f:
        data = json.load(f)
    
    result = defaultdict(list)
    for playlist in ifilter(lambda p: p['name'] == 'PLAYLIST3', data['playlists']):
        for item in playlist['items']:
            track = item['track']['trackName']
            album = item['track']['albumName']
            result[album].append(track)
    

    【讨论】:

    • 如何打印结果?尝试这样做只会打印defaultdict(<class 'list'>, {})之类的内容
    • 是的,没关系,否则你可以将其转换为字典然后打印,或者使用 pprint 或转储到 json 文件...
    • defaultdict 正是为了解决您的问题,因为您不需要检查密钥是否存在或创建它并将其设置为列表,然后只有您可以附加到它。
    【解决方案2】:

    如果您想将歌曲分类到包含歌曲列表的独特专辑中,下面的代码应该可以完成工作。 结果是dict 到歌曲list;如果曲目不是专辑,它会忽略它,如果专辑在res 中不存在,它会创建它。

    results = {}
    for playlist in data['playlists']:
        # if playlist['name'] == 'PLAYLIST3':
        if 'items' in playlist:
            for item in playlist['items']:
                # extract data 
                track_name = item['track']['trackName']
                album = item['track']['albumName']
                # create album in results if not exist
                # if the album names are not following the same typo, normalize them here 
                # like album = album.lower()
                if album not in results:
                    results[album] = []
                # if track is not once inserted in album insert it
                if track_name not in results[album]:
                    results[album].append(track_name)
    # use results as you wish
    print(results)
    

    【讨论】:

    • 我做了类似的事情:抱歉不知道如何在 cmets 中发布代码?
    • 您可以编辑问题并在最后分享您的最终解决方案,以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多