2015-10-19 83 views
2

我有50個字典的列表,並希望按該字典的'Key2'值進行排序。訪問Python中的字典列表並使用值對其進行排序(嵌套字典)

list1= [{'outside_key1': [ { 'key1': 'one', 'key2': 'xyz','key3':'three'}]} , 
     {'outside_key2': [ { 'key1': 'one', 'key2': 'abc','key3':'three'}]}] 

鍵2可以靜態地訪問:

>>>print list1[0]['outside_key1'][0]['key2'] 
    xyz 

現在排序依據 'KEY2' 我愛:

sorted_list = sorted(list1, key=lambda k: k[???]) 

最終由值排序變爲:

[{'outside_key2': [ { 'key1': 'one', 'key2': 'abc','key3':'three'}]} , 
{'outside_key1': [ { 'key1': 'one', 'key2': 'xyz','key3':'three'}]}] 

所以我的問題:
1.我如何動態訪問'Key2'的值?
2.我如何根據'Key2'的值對字典列表進行排序?

+0

「外部」字典總是隻有一個鍵嗎? – mgilson

+0

是的外部字典總是有一個單一的關鍵。 –

回答

1
list1= [{'outside_key1': [ { 'key1': 'one', 'key2': 'xyz','key3':'three'}]} , 
     {'outside_key2': [ { 'key1': 'one', 'key2': 'abc','key3':'three'}]}] 
sort_on = "key2" 
decorated = [(dict_.values()[0][0][sort_on], dict_) for dict_ in list1] 
decorated.sort() 
result = [dict_ for (key, dict_) in decorated] 
print result 

dict_.values()得到外部DIC值,第一個[0]得到的值outside_key1,內部列表的第二個[0]獲得的第一個值。

這是最快的方法,因爲它避免使用自定義比較函數,而是使用內置比較。您可以從Sorting Lists of Dictionaries

+0

這很完美。非常感謝。 :) –

0

假設你只有每個字典的一個鍵,你可以這樣做:

sorted(list1, key=lambda d: d[next(iter(d))][0]['key2']) 

這裏:d[next(iter(d))]將給予d相關聯的第一項的值。當然,字典是無序的,因此,「第一」的關鍵,只有當你只有在字典一個鍵 - 值對有意義......


FWIW,好像你的數據結構是真的在這裏獲得一個乾淨的解決方案。這似乎是字典的平面列表將存儲數據有更好的方式:

list1 = [ 
    {'key1': 'one', 'key2': 'abc', 'key3':'three'}, 
    { 'key1': 'one', 'key2': 'xyz','key3':'three'}, 
] 

作爲具有隻有一個值只有一個值字典和列表往往使容器有點大材小用。