【问题标题】:Sort list of dictionaries by key using a custom sort function使用自定义排序功能按键对字典列表进行排序
【发布时间】:2018-08-26 00:06:21
【问题描述】:

我有一个字典列表,我希望在 python 中通过键“id”进行排序。

items = [{'id' : 883},{'id' : 547},{'id' : 898},{'id' : 30},{'id' : 883}]

我希望根据给定的排序顺序按特定顺序对它们进行排序:

[30, 883, 547, 898]

我将如何在 python3 中执行此操作?

【问题讨论】:

  • 本例中的排序逻辑是什么?
  • 究竟什么逻辑可能产生这种排序? (30 883 547 898) 正如@janos 指出的那样,没有一个答案试图回答这个问题,因为它们忽略了你奇怪且无法解释的所需顺序。编辑:布伦丹确实尊重您要求的订单。
  • 显然这是zig-zag sort 的一个例子。 (开玩笑,我想)

标签: python list sorting dictionary


【解决方案1】:

使用key 参数和具有自定义排序顺序的列表。

sort_order = [30, 883, 547, 898]
items.sort(key=lambda d: sort_order.index(d['id']))

使用 @Sphinx 的建议,您可以预先索引列表以提高速度 O(1) 而不是 O(n)

sort_order_index = {val: i for i, val in enumerate(sort_order)}
items.sort(key=lambda d: sort_order_index.get(d['id'], 0))

【讨论】:

  • 咦,这就是他想要的?不错的python-fu,+1
  • 使用sort_order={}而不是sort_order=[]会更好吗? sort_order.index(id) 应该比 dict[id]
  • 我不太喜欢使用index,因为它的O(n) 方面
  • @Sphinx:用集合替换列表会破坏 sort_order 中项目的初始顺序,因此算法失败。 Watch the difference between print( [30, 883, 547, 898])` 和 print({30, 883, 547, 898})
  • @Sphinx 好主意
【解决方案2】:

您可以尝试在一行中不使用循环,如下所示:

items = [{'id' : 883},{'id' : 547},{'id' : 898},{'id' : 30},{'id' : 883}]

sorting_order=[30, 883, 547, 898]

print(sorted(items,key=lambda x:sorting_order.index(x['id'])))

输出:

[{'id': 30}, {'id': 883}, {'id': 883}, {'id': 547}, {'id': 898}]

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2014-02-11
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多