0

我正在尝试对包含列表的字典进行排序。例如,如果我有这本字典:

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

我希望排序后的输出为:

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

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

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

我不确定是否可以得到带有字典的元组的输出,因为我正在对该字典中的列表进行排序。

我试过这段代码:

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

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

4

3 回答 3

2

让我们分解问题。你真的想对列表进行排序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]给你字典{3: [4, 2, 7]}.values()给你列表[[4, 2, 7]],然后[0][1]给你2。辅助排序键是简单的to_sort[0]

所以我们得到:

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

我们就快到了。现在你只需要告诉 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)
于 2013-02-06T01:01:04.783 回答
1

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

>>> 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

请注意, 位于^的正下方=

这并没有告诉你为什么在那里出现错误,但至少它告诉你在哪里看。

一旦你仔细观察,就会注意到这个子表达式:

(x,b.items(), key=lambda x:[1][2])

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

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

没有SyntaxError。看起来这会在IndexError以后发生,但是当你到达那里时你可以处理它。

于 2013-02-06T00:50:29.503 回答
0

我不是 100% 确定,但你最终会追求吗?

>>> 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]})]
于 2013-02-06T01:00:00.213 回答