2017-04-07 72 views
1

我有一個列表分組列表中唯一值

list = [{'album': 'Spring Times', 'artist': 'Momo Pulse'}, {'album': 'Spring Times', 'artist': 'K.oshkin'}, {'album': 'Damn ', 'artist': 'Florent B'}] 

我想組它來獲得:

list = [{'album': 'Spring Times', 'artist1': 'Momo Pulse', 'artist2': 'K.oshkin'}, {'album': 'Damn ', 'artist1': 'Florent B'}] 

我怎麼能這樣做? 任何想法?

+0

不要字典只包含' 'album''和'' artist''? –

+1

這不是排序。 –

+0

@WillemVanOnsem是的,只有這個鍵 – Aaron

回答

-1
from collections import defaultdict 

l = [{'album': 'Spring Times', 'artist': 'Momo Pulse'}, 
    {'album': 'Spring Times', 'artist': 'K.oshkin'}, 
    {'album': 'Damn ', 'artist': 'Florent B'}] 
d = defaultdict(list) 

for record in l: 
    d[record['album']].append(record['artist']) 

我們現在有一個字典映射專輯名稱到藝術家列表。

final = [] 

for album, artists in d.items(): 
    temp = {'album': album} 
    for i, x in enumerate(artists, start=1): 
     temp['artist{}'.format(i)] = x 
    final.append(temp) 

print(final) 

打印

[{'album': 'Damn ', 'artist1': 'Florent B'}, {'album': 'Spring Times', 'artist1': 'Momo Pulse', 'artist2': 'K.oshkin'}] 
-1
l = [{'album': 'Spring Times', 'artist': 'Momo Pulse'}, {'album': 'Spring Times', 'artist': 'K.oshkin'}, {'album': 'Damn ', 'artist': 'Florent B'}] 

albums = {} 
for el in l: 
    album = albums.setdefault(el['album'], {}) 
    artist_id = sum(1 for k in album if k.startswith('artist')) 
    album['artist'+str(artist_id)] = el['artist'] 

l2 = albums.values() #This is your output 
0
from itertools import groupby 

# input 
my_list = [{'album': 'Spring Times', 'artist': 'Momo Pulse'}, {'album': 'Spring Times', 'artist': 'K.oshkin'}, {'album': 'Damn ', 'artist': 'Florent B'}] 

# Have a function to return the merged dictionary after an update 
def merge_dict(a, b): 
    a.update(b) 
    return a 

# key function for sort and groupby 
sortkey = lambda d: d['album'] 

# Sort and group by album 
my_groups = groupby(sorted(my_list, key=sortkey), key=sortkey) 

# Generate output 
print [merge_dict({'album':k},{'artist'+str(i+1):d['artist'] for i, d in enumerate(g)}) for k, g in my_groups]