2016-06-01 20 views
3

ich eine Liste von dict wie diese haben, der Wert jedes dict Schlüssel ist eine Liste,Python dict Schlüssel-Liste als Wert Sortiert

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

Die Anzahl der dict in der Liste variieren.

Wie ich eine Ausgabe wie diese bekommen kann, Jeder dict Wert aufsteigend

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

Antwort

1

Verwenden list comprehensions zu flach der Liste des dicts in eine Liste von Tupeln (value, key) verwendet sorted sie um den Wert zu sortieren, Verwenden Sie str.join, um Ihre Ausgabe zu formatieren.

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

Ein Motto:

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) 

Ein Multi-Liner:

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

Sie verwenden itertools zur Lösung dieses Problems:

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: 'dict_values'-Objekt unterstützt keine Indizierung'. Es ist dieser Teil - 'i.values ​​() [0]' – MaxU

Verwandte Themen