【问题标题】:sorting a nested dictionary with lists in python在python中使用列表对嵌套字典进行排序
【发布时间】:2013-01-21 02:17:23
【问题描述】:

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

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

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

【问题讨论】:

  • 语法错误说什么?
  • @user1988876 在原始帖子中,您说您想使用list.index[1] 处的项目作为排序键。您是指每个列表中的第一项(即 list[0])还是第二项?

标签: python list sorting dictionary nested


【解决方案1】:

让我们分解问题。您真的想对列表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)

【讨论】:

  • 精彩的分步说明。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我不是 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]})]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-20
      • 2016-10-31
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2016-10-17
      • 2021-03-08
      相关资源
      最近更新 更多