将复杂的排序字典放入已排序的列表中

2024-03-29 10:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下课程:

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

我还有一本字典,是由一堆销售记录和SalesRecord.name名称作为关键。如何使用以下条件(假设所有值都是整数)将值排序到已排序的列表中:

  1. 按美元分类
  2. 然后按itemsPurchased-itemsSold desc
  3. 然后按项目描述
  4. 然后按位置asc

另外,我很好奇,但是这种类型的总体运行时间是什么呢?在最坏的情况下需要迭代4次吗?你知道吗


Tags: name名称字典排序记录position整数条件
3条回答

最简单的方法是利用sort stability在多个阶段进行排序(首先按位置排序,然后按购买的物品降序排序等)。你知道吗

这比看上去便宜,因为TimSort algorithm利用了已经部分排序的元素。你知道吗

这种方法也比试图构建过于复杂的key-function更容易正确。你知道吗

你有两个选择。两个选项都以线性时间运行,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)

按优先级从^到^的不同键排序。在按高优先级键排序后,按该键比较相等的项将保证保持在低优先级键排序后的顺序。你知道吗

使用复合键。你知道吗

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

相关问题 更多 >