根据某个键对字典列表进行排序

时间:2015-02-17 06:32:03

标签: python list sorting python-3.x dictionary

    runnerList = [{1:{"name":"John","height":173,"age":16}},
                  {2:{"name":"Fred","height":185,"age":18}},
                  {3:{"name":"Luke","height":181,"age":17}}]

我一直试图根据跑步者的年龄按升序排序这个词典列表,但没有成功:(我试过了:

    import operator
    runnerList.sort(key=lambda x: x['age'], reverse=True)

但似乎没有任何事情发生。我该怎么做?

3 个答案:

答案 0 :(得分:0)

试试这个:

runnerList.sort(key=lambda x: x.values()[0]['age'])
print runnerList

您收到错误的原因是您的相关词典(包含age键的词典)也包含在另一个词典中。解决方案同样简单地获取外部values()的{​​{1}}并获取第一个元素(dict),它为您提供了内部唯一的字典。

此外,我删除了您示例中使用的[0]。它会以降序向您提供结果,并且您明确要求它们以升序

声明:

如果您使用的是Python版本> = 3:,则必须转换使用reverse=True创建的生成器对象。

values()

答案 1 :(得分:0)

runnerList是词典的词典列表。 如果您确定每个列表条目只有一对键值,那么您可以按以下方式排序:

runnerList.sort(key=lambda x: list(x.values())[0]['age'], reverse=True)

如果每个列表条目都有多个键值对,那么您需要更好地指定排序逻辑。你会在这样的名单上做什么?:

runnerList = [{1:{"name":"John","height":173,"age":16}},
                  {  2:{"name":"Fred","height":185,"age":18},
                     4:{"name":"Fred","height":185,"age":13}
                  },
                  {3:{"name":"Luke","height":181,"age":17}}]

答案 2 :(得分:-1)

你基本上有listList形式的runnerList,因为它包含在[]中。首先将其更改为字典,如

 runnerList = {1:{"name":"John","height":173,"age":16},
              2:{"name":"Fred","height":185,"age":18},
              3:{"name":"Luke","height":181,"age":17} }

然后您可以import operator并可以使用以下功能对项目进行排序并打印

sorted_runnerList = sorted(runnerList.items(),key=lambda x: x[1]['age'],)

虽然这会直接在字典中对字典中的年龄进行排序

所以基本上你的功能变成了

import operator
runnerList = {1:{"name":"John","height":173,"age":16},
              2:{"name":"Fred","height":185,"age":18},
              3:{"name":"Luke","height":181,"age":17} }

sorted_runnerList = sorted(runnerList.items(),key=lambda x: x[1]['age'],)
print sorted_runnerList

但请记住,因为我们使用的是.items(),它会返回不可变的元组

输出

[(1, {'age': 16, 'name': 'John', 'height': 173}), (3, {'age': 17, 'name': 'Luke', 'height': 181}), (2, {'age': 18, 'name
': 'Fred', 'height': 185})]
相关问题