繁体   English   中英

复杂的排序字典到排序列表中

[英]Complex sort dictionary into sorted list

我有以下课程:

class SalesRecord:
    name = ''
    dollarsSpent = 0
    itemsPurchased = 0
    itemsSold = 0
    position = 0

我也有一个字典,该字典由这些SalesRecords一堆组成,并以SalesRecord.name作为键。 如何使用以下条件将值排序到排序列表中(假设所有内容都是整数):

  1. 按美元排序
  2. 然后按项目购买-项目已售desc
  3. 然后按项目购买desc
  4. 然后按位置升序

同样,只是好奇,但是这样的总体运行时间是多少? 在最坏的情况下是否需要迭代4次?

使用复合键。

sorted((k, v) for (k, v) in somedict, key=lambda (k, v):
  (-v.dollarsSpent, -(v.itemsPurchased - v.itemsSold),
  -v.itemsPurchased, v.position))

您有两个选择。 这两个选项都在线性运算时间O(nlog(n)) ,但您可能会认为它更具可读性。 您可以使用复合排序键:

def sortkey(salesrecord):
    r = salesrecord
    return (
        -r.dollarsSpent,
        -r.itemsPurchased + r.itemsSold,
        -r.itemsPurchased,
        r.position
    )
sorted(salesdict.values(), key=sortkey)

或多次排序,具体取决于排序算法的稳定性:

l = salesdict.values()
l.sort(key=lambda r: r.position)
l.sort(key=lambda r: r.itemsPurchased, reverse=True)
l.sort(key=lambda r: r.itemsPurchased - r.itemsSold, reverse=True)
l.sort(key=lambda r: r.dollarsSpent, reverse=True)

使用稳定排序 ,您可以按优先级从低到高的顺序对多个优先级不同的键进行排序。 在按优先级较高的键排序之后,保证与该键比较相等的项保持在优先级较低的键排序后的顺序。

最简单的方法是利用分类稳定性在多个阶段进行分类(首先是按位置,然后是按降序购买的商品,等等)。

这比看起来便宜,因为TimSort算法利用了已经部分排序的元素。

与尝试构建过于复杂的键功能相比,这种方法更容易正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM