2016-06-01 1 views
3

J'ai une liste de dict comme celui-ci, la valeur de chaque touche dict est une liste,Python clé dict Trié par liste en tant que valeur

[{'mike':[500,1000,1500,2750,3000]},{'john':[750,1250,2000]},{'luke':[600,1100]}] 

Le nombre de dict dans la liste varie.

Comment puis-je obtenir une sortie comme ça, Chaque valeur dict dans l'ordre croissant

500:mike 
600:luke 
750:john 
1000:mike 
1100:luke 
1250:john 
1500:mike 
2000:john 
2750:mike 
3000:mike 

Répondre

1

Utilisez list comprehensions à plat la liste des dicts dans une liste de tuples (value, key), utilisez sorted pour les trier par la valeur, utilisez str.join pour formater votre sortie.

list_dicts = [ {'mike':[500,1000,1500,2750,3000]}, 
       {'john':[750,1250,2000]}, 
       {'luke':[600,1100]}] 

# flat the list of dicts as a list of tuples (value, key), sort them 
result = sorted([(item, k) for d in list_dicts for k, l in d.items() for item in l]) 

# format output 
print('\n'.join([':'.join([str(i) for i in t]) for t in result])) 
# Output 
500:mike 
600:luke 
750:john 
1000:mike 
1100:luke 
1250:john 
1500:mike 
2000:john 
2750:mike 
3000:mike 
0
a,b=[],[] 
for i in g: 
    for k in i.values()[0]: 
     a.append(k) 
     b.append(i.keys()) 

print sorted(zip(a,b)) 
2

une doublure:

result = sorted(((item, key) for d in x for (key, value) in d.items() for item in value), key=lambda x: x[0]) 

for elem in result: 
    print ({elem[0]}:{elem[0]}.format(elem=elem) 

Une doublure à plusieurs:

x = [{"mike":[500,1000,1500,2750,3000]},{"john":[750,1250,2000]},{"luke":[600,1100]}] 
result = [] 
for item in x: 
    for key, value in item.iteritems(): 
     for v in value: 
      result.append((v, key)) 
result.sort(key=lambda x: x[0]) 
for elem in result: 
    print ({elem[0]}:{elem[0]}.format(elem=elem) 

# outputs 
500:mike 
600:luke 
750:john 
1000:mike 
1100:luke 
1250:john 
1500:mike 
2000:john 
2750:mike 
3000:mike 
1

Vous utilisez itertools pour résoudre ce problème:

from itertools import product, chain 

LL = list(chain(*[list(product(i.keys(), i.values()[0])) for i in L])) 
sorted(LL, key=lambda x: x[1]) 

Out[152]: 
[('mike', 500), 
('luke', 600), 
('john', 750), 
('mike', 1000), 
('luke', 1100), 
('john', 1250), 
('mike', 1500), 
('john', 2000), 
('mike', 2750), 
('mike', 3000)] 
+0

Python 3. 5.1: 'TypeError: l'objet 'dict_values' ne supporte pas l'indexation'. C'est cette partie - 'i.values ​​() [0]' – MaxU