2013-02-06 65 views
0

我想排序包含列表的字典。举例来说,如果我有这样的词典:使用python列表排序嵌套字典

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

它引发的错误无效语法,我无法弄清楚什么是错的。

+0

什么语法错误说? –

+0

@ user1988876在原始文章中,你说你想使用'list.index [1]'中的项目作为排序关键字。通过这个,你的意思是第一个(这是列表[0]),还是每个列表中的第二个项目? – APerson

回答

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]})] 

我们几乎没有。现在你只需要告诉排序你想要反向输出:

>>> 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) 
+0

神奇的一步一步的解释。 –

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,但当你到达那里时你可以处理。

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]})]