【问题标题】:Sorting dictionary based on another dictionary [duplicate]基于另一个字典对字典进行排序[重复]
【发布时间】:2018-03-06 19:25:13
【问题描述】:

我有两个 Python 字典 -

dict1 = {'a' : [1, 2, 3], 'b' : [4, 5, 6], 'c' : [7, 8, 9]}
dict2 = {'a' : 30, 'b' : 75, 'c' : 15}

我想根据dict2 的值对dict1 进行排序。 最终的答案应该是 -

[['c', [7, 8, 9]], ['a', [1, 2, 3]], ['b', [4, 5, 6]]]

解决这个问题的最有效方法是什么?

【问题讨论】:

  • 你能贴出你的代码吗,你试过了吗?
  • Python 中的字典没有顺序。如果你想要一个有序的字典,你可以使用来自collectionsOrderedDict。但是,您的最终答案实际上是一个列表。
  • 普通的dicts在Python中是没有顺序的,所以不能排序。你必须使用OrderedDict
  • 是的,但 OP 显示的是列表列表,而不是字典。

标签: python python-3.x sorting dictionary


【解决方案1】:

是的。使用 sorted() 并传递一个“key”函数,该函数知道如何获取要排序的值。比如:

sorted(dict1.items(), key=lambda kv: dict2[kv[0]])

请注意,我将其保留为元组列表。如果你想要一个真正的字典,你必须使用 OrderedDict。

【讨论】:

  • 为 Lamba 参数添加了括号。注意“类似的东西”。
  • 在这种情况下,您可以“匿名化”您的第二个参数,因为它没有被使用:key=lambda (k, _): dict2[k]
  • @DustinOprea。请正确测试您的代码。它目前在 python3(OP 正在使用)中引发 SyntaxError。
  • @ekhumoro 这只是一个即兴的建议。即使我只是花点时间给他策略时打错了东西,这种方法也是有效的。再次,我说“像这样”。立即尝试。
【解决方案2】:

请注意,您的结果不再是 dict,而是列表列表,如果您想对其进行排序,这会更好,因为无法保证 dicts 中的顺序/实现细节

我会根据另一个字典中键的值对项目进行排序,并将items产生的元组转换为2元素list

dict1 = {'a' : [1, 2, 3], 'b' : [4, 5, 6], 'c' : [7, 8, 9]}
dict2 = {'a' : 30, 'b' : 75, 'c' : 15}

print([list(x) for x in sorted(dict1.items(),key = lambda x : dict2[x[0]])])

结果:

[['c', [7, 8, 9]], ['a', [1, 2, 3]], ['b', [4, 5, 6]]]

【讨论】:

    【解决方案3】:

    你可以试试这个:

    dict1 = {'a' : [1, 2, 3], 'b' : [4, 5, 6], 'c' : [7, 8, 9]}
    dict2 = {'a' : 30, 'b' : 75, 'c' : 15}
    new_data = list(map(list, sorted(dict1.items(), key=lambda x:dict2[x[0]])))
    

    输出:

    [['c', [7, 8, 9]], ['a', [1, 2, 3]], ['b', [4, 5, 6]]]
    

    【讨论】:

    • 我可能会选择列表解析而不是list(map(…)),也许是:[[k, dict1[k]] for k in sorted(dict1.keys(), key=lambda x:dict2[x])]
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2021-05-29
    • 2011-06-19
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多