在python中使用列表对嵌套字典进行排序

2024-05-17 02:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在整理一本有单子的词典。例如,如果我有这本字典:

a = {'q': {3: [4, 2, 7]}, 'a': {1: [5, 45, 11]}, 'e': {23: [11, 45, 2]}}

我希望排序后的输出为:

^{pr2}$

我实际上是逆向排序,使用列表中的第一项作为排序的键。在

如果两个列表的前一项相同,如上面所示,我将按字母顺序对与列表(主键)关联的字符串进行排序。在

我不确定是否能得到包含字典的元组的输出,因为我正在为字典中的列表排序。在

我试过这个代码:

sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())

它引发了一个无效语法的错误,我不知道出了什么问题。在


Tags: 字符串代码列表字典排序顺序字母items
3条回答

我不是百分之百肯定,但你最终是在追求吗?在

>>> a = {'q': {3: [4, 2, 7]}, 'a': {1: [5, 3, 11]}, 'e': {23: [11, 45, 2]}}
>>> new_order = sorted(a, key=lambda L: a[L].values(), reverse=True)
>>> zip(new_order, map(a.get, new_order))
[('e', {23: [11, 45, 2]}), ('a', {1: [5, 3, 11]}), ('q', {3: [4, 2, 7]})]

让我们把这个问题分成几个部分。您确实想对列表a.items()排序。所以:

>>> to_sort = a.items()
>>> to_sort
[('q', {3: [4, 2, 7]}), ('a', {1: [5, 3, 11]}), ('e', {23: [11, 45, 2]})]

现在,对于列表中的每个元素,都有一个值为'q'等)的元组和一个字典。假设每个字典只包含一个键,您希望使用每个字典值的index-1元素作为主键。所以,第一个元素的键应该是:to_sort[0][1].values()[0][1]to_sort[0][1]给你字典{},.values()给你一个列表{},而{}给你{}。辅助排序键只是to_sort[0]。在

所以我们得到:

^{pr2}$

我们快到了。现在只需告诉sort您想要反向输出:

>>> sorted(to_sort, key=lambda x: (x[1].values()[0][1], x[0]), reverse=True)
[('e', {23: [11, 45, 2]}), ('a', {1: [5, 3, 11]}), ('q', {3: [4, 2, 7]})]

这是你想要的吗?在

如果您想要一条直线,您可以:

>>> sorted(a.items(), key=lambda x: (x[1].values()[0][1], x[0]), reverse=True)

至少在交互式解释器中,完整的错误消息应准确显示错误发生的位置:

>>> sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())
  File "<stdin>", line 1
    sorted((x,b.items(), key=lambda x:[1][2]) for x,b in a.items())
                            ^
SyntaxError: invalid syntax

注意,^就在=的正下方。在

这并不能告诉你为什么会有错误,但至少它告诉你应该去哪里看。在

仔细观察后,注意下面的子表达式:

^{pr2}$

这是一个元组,它的第三个成员是key=lambda x:[1][2]。但作为一个表达式,这是无效的。所以,你把括号放错地方了。或者,您将key参数添加到了错误的位置。我想你的意思是:

sorted(((x,b.items()) for x,b in a.items()), key=lambda x:[1][2])

没有SyntaxError那里。看起来以后会得到一个IndexError,但是你到了那里就可以处理了。在

相关问题 更多 >