Python:如何基于键值对对字典进行分组

时间:2014-06-29 14:25:13

标签: python mysql database list dictionary

假设我在Python中有一个包含此格式的音频元数据的词典列表:

metadata = {'title': meta['title'][0],
            'artist': meta['artist'][0],
            'album': meta['album'][0],
            'path': path}

有没有办法迭代这些词典列表,根据artist字段将唯一artists字段连接到单个album字段,但保留其中一个路径?

例如,转换这些词典:

m1 = {'title': 'Song 1', 'artist': 'Artist 1', 'Album': 'Album 1', 'Path': 'path 1'}
m2 = {'title': 'Song 2', 'artist': 'Artist 1 Ft 2', 'Album': 'Album 1', 'Path': 'path 2'}
m3 = {'title': 'Song 3', 'artist': 'Artist 1 Ft 3', 'Album': 'Album 1', 'Path': 'path 3'}

进入这个:

m4 = {'artist': 'Artist 1; Artist 1 Ft 2; Artist 1 Ft 3', 'Album': 'Album 1', 'Path': 'path 1'}

这背后的原因是我想从文件列表(由词典表示)创建专辑及其艺术家列表,但我需要保留其中一条路径来获取专辑图片。

到目前为止,我已经尝试将所有数据添加到MySQL数据库中,将专辑图片的BLOB放在image列中,然后运行SQL命令:

CREATE TABLE albums SELECT album, image, GROUP_CONCAT(DISTINCT artist SEPARATOR '; ') AS artists FROM tracks GROUP BY album

然后从主轨道数据库中删除图像列,但是这实际上是资源密集型的,并且在构建数据库时占用了大量不必要的空间,所以理想情况下我需要一些方法来处理原始数据首先是Python。

编辑:我忘了提及,在词典列表中,会有多个专辑。我需要最终结果是一个字典列表,每个字典包含一个唯一的专辑和一个与该专辑相对应的所有艺术家标签的连接列表。

1 个答案:

答案 0 :(得分:3)

m = [
    {'title': 'Song 1', 'artist': 'Artist 1',
        'Album': 'Album 1', 'Path': 'path 1'},
    {'title': 'Song 2', 'artist': 'Artist 1 Ft 2',
        'Album': 'Album 1', 'Path': 'path 2'},
    {'title': 'Song 3', 'artist': 'Artist 1 Ft 3',
        'Album': 'Album 1', 'Path': 'path 3'}
]

from collections import defaultdict

# Group all the artists, as per the Album name
d = defaultdict(list)
for item in m:
    d[item["Album"]].append(item["artist"])

# Gather paths corresponding to the Albums
p = {item["Album"]: item["Path"] for item in m}

# Recreate a list of all albums with artist names joined
result = []
for album in d:
    result.append({
        "Album" : album,
        "artist": "; ".join(d[album]),
        "Path"  : p[album]
    })

print result