2017-05-27 9 views
0

私はmyListというリストを持っています。私が達成しようとしているのは、年齢キーの値に基づいてリストのリストを並べ替えることです。私はそれがソートされた関数で行うことができますが、私はどのようにキーの関数を記述するのか分からない。誰も私の問題を解決するためのアイデアを提案することができます。ソートされた関数を使用してリストのネストされたリストをソートする。

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}} 
     ] 

答えて

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

[{ 'ロレックス' { '年齢':20 '給与':450000}}、{ 'ロン' { '年齢': 20、 '給与':500000}}、{'年齢:20、'給与 ':200000}}、{' fyoid ': {年齢:24、給与:400000} {'年齢':30、 '給料':600000}}、{'gilex':{'john'}、{'年齢':25、 '給料': 250000}年齢 ': 30、' salary ':450000}}、{' devon ':{' age ':33、' salary ': 600000}}、 { 'トッド' { '年齢':40 '給与':300000}}、{ 'larrat' { '年齢':41、 '給与':350000}}]

1

問題は、リストに辞書が含まれている辞書が含まれていることです。あなたは何とか内部の辞書を取得する必要があります。これは一般に、nextアイテムを取得することによって解決されます:next(iter(subdict.values()))'age'とその後'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}}] 

代わりの機能INEあなたも可能性lambdadef

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

は同様に動作:

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

しかし私は個人的にはDataFrame sの

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}] 

も簡単:

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}] 

key -function簡単になります(あなたがしてDataFramesとしてpandasへのアクセス権を持っている単一の辞書やcollections.namedtuple Sとして、あるいはいずれかの場合)最初の辞書をフラット化:

>>> 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

アンパックを使用してレコードを取得することもできます: 'inner_dict、= somedict.values(); return inner_dict ['age'] 'しかし、値が1つしかないと確信する必要があります。 – AChampion

関連する問題