2017-05-27 3 views
0

Ich habe eine Liste namens myList. Was ich versuche zu erreichen ist, dass ich die Liste der Liste basierend auf dem Wert des Altersschlüssel sortieren möchte. Ich weiß, dass es mit sortierter Funktion getan werden kann, aber ich weiß nicht, wie man Funktion für den Schlüssel schreibt. Jeder kann mir vorschlagen, mein Problem zu lösen.Sortieren geschachtelte Liste der Liste mit sortierten Funktion.?

myList = [ {'john':{'age':30 ,'salary':600000}}, {'mullar':{'age':25 ,'salary':250000}}, 
      {'todd':{'age':40 ,'salary':300000}},{'rolex':{'age':20 ,'salary':450000}}, 
      {'ron':{'age':20 ,'salary':500000}},{'gilex':{'age':30 ,'salary':450000}}, 
      {'larrat':{'age':41 ,'salary':350000}},{'fyoid':{'age':24 ,'salary':400000}}, 
      {'devon':{'age':33 ,'salary':600000}},{'dron':{'age':20 ,'salary':200000}} 
     ] 

Antwort

1
def getAge(d): 
    salary = list(d.values())[0]['age'] 
    return salary 



#d.values() => dict_values([{'age': 30, 'salary': 600000}]) 
#list(d.values()) => [{'age': 30, 'salary': 600000}] 
#list(d.values())[0] => {'age': 30, 'salary': 600000} 
##list(d.values())[0]['age'] => 30 
print(sorted(myList,key=getAge)) 

RESULT

[{ 'rolex': { 'Alter': 20 'Gehalt': 450000}}, { 'ron': { 'Alter': 20, 'Gehalt': 500000}}, {'Dron': {'Alter': 20, 'Gehalt': 200000}}, {'fyoid': {'Alter': 24, 'Gehalt': 400000} }, {'mullar': {'Alter': 25, 'Gehalt': 250000}}, {'John': {'Alter': 30, 'Gehalt': 600000}}, {'gilex': {' Alter ': 30,' Gehalt ': 450000}}, {' devon ': {' Alter ': 33,' Gehalt ': 600000}}, { 'Todd: { 'Alter': 40, 'Gehalt': 300000}}, { 'Larrat': { 'Alter': 41, 'Gehalt': 350000}}]

1

Das Problem ist, dass Ihre Liste ein Wörterbuch enthält, das ein Wörterbuch enthält. Sie müssen irgendwie das innere Wörterbuch bekommen. Dies wird in der Regel durch den next Artikel: next(iter(subdict.values())) gelöst. danach den 'age' Wert zu erhalten ist nicht kompliziert, nur Index mit 'age':

>>> sorted(myList, key=lambda x: next(iter(x.values()))['age']) 
[{'rolex': {'age': 20, 'salary': 450000}}, 
{'ron': {'age': 20, 'salary': 500000}}, 
{'dron': {'age': 20, 'salary': 200000}}, 
{'fyoid': {'age': 24, 'salary': 400000}}, 
{'mullar': {'age': 25, 'salary': 250000}}, 
{'john': {'age': 30, 'salary': 600000}}, 
{'gilex': {'age': 30, 'salary': 450000}}, 
{'devon': {'age': 33, 'salary': 600000}}, 
{'todd': {'age': 40, 'salary': 300000}}, 
{'larrat': {'age': 41, 'salary': 350000}}] 

Statt eine lambda Sie könnten auch def ine Funktion:

def age(somedict): 
    inner_dict, = somedict.values() # or inner_dict = next(iter(somedict.values())) 
    return inner_dict['age'] 

Funktioniert auch:

>>> sorted(myList, key=age) 
[... same as above ...] 

Allerdings würde ich persönlich abflachen die Wörterbücher zuerst (entweder als Einzel Wörterbücher oder collections.namedtuple s oder wenn Sie Zugriff auf pandas dann als DataFrames haben):

sorted(myList2, key=lambda x: x['age']) # or operator.itemgetter('age') 
[{'age': 20, 'name': 'rolex', 'salary': 450000}, 
{'age': 20, 'name': 'ron', 'salary': 500000}, 
{'age': 20, 'name': 'dron', 'salary': 200000}, 
{'age': 24, 'name': 'fyoid', 'salary': 400000}, 
{'age': 25, 'name': 'mullar', 'salary': 250000}, 
{'age': 30, 'name': 'john', 'salary': 600000}, 
{'age': 30, 'name': 'gilex', 'salary': 450000}, 
{'age': 33, 'name': 'devon', 'salary': 600000}, 
{'age': 40, 'name': 'todd', 'salary': 300000}, 
{'age': 41, 'name': 'larrat', 'salary': 350000}] 

Noch einfacher mit DataFrame s:

myList2 = [{'name': key, 'age': value['age'], 'salary': value['salary']} 
      for dct in myList 
      for key, value in dct.items()] 
print(myList2) 
#[{'age': 30, 'name': 'john', 'salary': 600000}, 
# {'age': 25, 'name': 'mullar', 'salary': 250000}, 
# {'age': 40, 'name': 'todd', 'salary': 300000}, 
# {'age': 20, 'name': 'rolex', 'salary': 450000}, 
# {'age': 20, 'name': 'ron', 'salary': 500000}, 
# {'age': 30, 'name': 'gilex', 'salary': 450000}, 
# {'age': 41, 'name': 'larrat', 'salary': 350000}, 
# {'age': 24, 'name': 'fyoid', 'salary': 400000}, 
# {'age': 33, 'name': 'devon', 'salary': 600000}, 
# {'age': 20, 'name': 'dron', 'salary': 200000}] 

Welche der key -function vereinfacht : = somedict.values ​​() `inner_dict;:

>>> import pandas as pd 
>>> df = pd.DataFrame(myList2) 
>>> df.sort_values('age') 
    age name salary 
3 20 rolex 450000 
4 20  ron 500000 
9 20 dron 200000 
7 24 fyoid 400000 
1 25 mullar 250000 
0 30 john 600000 
5 30 gilex 450000 
8 33 devon 600000 
2 40 todd 300000 
6 41 larrat 350000 
+1

Sie können auch mit dem Auspacken den Datensatz zu erhalten return inner_dict ['age'] 'aber du musst dir sicher sein, dass es nur einen Wert gibt. – AChampion

Verwandte Themen