2015-10-19 74 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'}, 
] 

作为具有只有一个值只有一个值字典和列表往往使容器有点大材小用。