Python 将复杂的字典排序到已排序的列表中
我有以下课程:Python 将复杂的字典排序到已排序的列表中,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我有以下课程: class SalesRecord: name = '' dollarsSpent = 0 itemsPurchased = 0 itemsSold = 0 position = 0 我还有一个字典,它由一堆SalesRecords构成,键是SalesRecord.name。如何使用以下条件将值排序到排序列表中(假设所有值都是整数): 按美元分类 然后通过itemsPurchased-itemsSold desc 然后通过逐项描述 然后按
class SalesRecord:
name = ''
dollarsSpent = 0
itemsPurchased = 0
itemsSold = 0
position = 0
我还有一个字典,它由一堆SalesRecords构成,键是SalesRecord.name。如何使用以下条件将值排序到排序列表中(假设所有值都是整数):
sorted((k, v) for (k, v) in somedict, key=lambda (k, v):
(-v.dollarsSpent, -(v.itemsPurchased - v.itemsSold),
-v.itemsPurchased, v.position))
使用复合键
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)
使用,通过按每个键从最低优先级到最高优先级排序,可以按具有不同优先级的多个键进行排序。按较高优先级的键排序后,按该键比较相等的项目将保证在较低优先级的键排序后保持原来的顺序。您有两个选项。两个选项都在线性时间内运行,<代码> 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)
使用,通过按每个键从最低优先级到最高优先级排序,可以按具有不同优先级的多个键进行排序。按较高优先级键排序后,按该键比较相等的项目保证在较低优先级键排序后保持其顺序。最简单的方法是利用多个阶段进行排序(首先按位置,然后按购买的项目降序等) 这比看起来便宜,因为它利用了已经部分有序的元素
这种方法也比试图建立一个过于复杂的模型更容易正确。最简单的方法是利用多个阶段进行排序(首先按位置,然后按购买的物品降序等) 这比看起来便宜,因为它利用了已经部分有序的元素
这种方法也比试图构建一个过于复杂的字典更容易正确。你能展示一下你字典的结构吗?它只是一个简单的字典结构。例如:
sales['Johnson1']=SalesRecord对象,其中SalesRecord.name='Johnson1'
可以显示字典的结构吗?它只是一个简单的字典结构。例如:sales['Johnson1']=SalesRecord.name='Johnson1'
中的SalesRecord对象这两个选项是否仍按最坏情况时间O(nlog(n))排序?@Gyrien:Yes。一个可能有一个更坏的常数因子,但这可能没关系。谢谢!另外,为什么在第二种情况下要先按r.position排序?@Gyrien:按itemsPurchased
排序后,任何具有相同采购项目数量的记录都将按position
排序后的顺序排序,因此列表将按采购项目排序,然后按位置排序。这一原则也适用于接下来的两种排序。这两个选项是否仍会在timsorts最坏情况下的时间O(nlog(n))进行排序?@Gyrien:是的。一个可能有一个更坏的常数因子,但这可能没关系。谢谢!另外,为什么在第二种情况下要先按r.position排序?@Gyrien:按itemsPurchased
排序后,任何具有相同采购项目数量的记录都将按position
排序后的顺序排序,因此列表将按采购项目排序,然后按位置排序。这一原则也适用于下两种类型。与user2357112提供的选项1相比,采用这种方式有什么好处?它不会在范围中添加其他名称。这两种方式都没什么大不了的。与用户2357112提供的选项1相比,这种方式有什么好处?它不会给范围添加其他名称。这也没什么大不了的。