使用itemgetter对字典列表进行排序

5

这是我的字典:

a = [{"id":1,"data":{"age":16,"name":a}}, 
     {"id":3,"data":{"age":35,"name":b}}, 
     {"id":2,"data":{"age":9,"name":c}}]

我希望按照“年龄”字段进行排序。

使用 lambda 我会这样写:

sorted(a, key=lambda k: k['data']['age'])

如何使用itemgetter实现这个功能?

8
这听起来像是一个寻找问题的解决方案。你试图通过要求使用itemgetter来实现什么目标? - NPE
1
以下两个答案都给出了 sorted(a, key = lambda k : itemgetter('age')(itemgetter('data')(k))),但这并没有比 sorted(a, key=lambda k: k['data']['age']) 更好。在这种情况下,我建议放弃使用 itemgetter - Steven Rumbalski
1
itemgetter并不适用于访问嵌套结构。它提供了一种非常简单的从序列中访问元素的方式,但对于更复杂的情况,使用函数/lambda是更好的选择。其他情况也是如此。例如,partial可用于提供一些位置参数,但如果您想指定第二个位置参数并留下第一个没有值,则最好使用lambda(尽管有陷阱...例如,在循环中创建lambda时要小心)。 - Bakuriu
也许他只是需要它来做作业 ;) - Imane Fateh
1
这实际上是一个情况,如果Python有某种组合运算符或函数会很好:key=compose(itemgetter('age'), itemgetter('data')) - chepner
2个回答

3

你最好先在"a"、"b"和"c"上加引号,否则你会在字典a和字符"a"之间产生混淆。

a = [{"id":1,"data":{"age":16,"name":"a"}}, 
     {"id":3,"data":{"age":35,"name":"b"}}, 
     {"id":2,"data":{"age":9,"name":"c"}}]

对于 itemgetter

from operator import itemgetter

a = [{"id":1,"data":{"age":16,"name":"a"}}, 
     {"id":3,"data":{"age":35,"name":"b"}}, 
     {"id":2,"data":{"age":9,"name":"c"}}]

l=sorted(a, key = lambda k : itemgetter('age')(itemgetter('data')(k)) )

print (l)

这应该是一个注释。 - Diego Herranz
谢谢,我完成了。 - Imane Fateh

0

你可以这样使用它:

sorted(a, key = lambda k : itemgetter('age')(itemgetter('data')(k)) )

输出:

[{'data': {'age': 9, 'name': 'c'}, 'id': 2},
{'data': {'age': 16, 'name': 'a'}, 'id': 1},
{'data': {'age': 35, 'name': 'b'}, 'id': 3}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接