复杂排序字典到排序列表

时间:2014-02-25 05:20:20

标签: python list sorting dictionary

我有以下课程:

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

我还有一个字典,其中包含一堆SalesRecord,其中SalesRecord.name为键。如何使用以下条件将值排序到排序列表中(假设所有内容都是整数):

  1. 按DollarSpent desc排序
  2. 然后通过itemsPurchased - itemsSold desc
  3. 然后通过itemsPurchased desc
  4. 然后按位置asc
  5. 另外,只是好奇,但这样的整体运行时间是什么?在最坏的情况下是否需要迭代4次?

3 个答案:

答案 0 :(得分:3)

使用复合键。

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

答案 1 :(得分:1)

您有两种选择。这两个选项都以线性时间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)

使用stable sort,您可以按照从最低优先级到最高优先级的每个键进行排序,按多个具有不同优先级的键进行排序。在使用优先级较高的密钥进行排序后,保证按照优先级较低的密钥排序后的顺序保留按该密钥相等的项目。

答案 2 :(得分:1)

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

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

这种方法比尝试构建过于复杂的key-function更容易实现。