Python:如何实现含多值元组的列表按多规则排序?
解决Python元组列表的多规则排序问题
当然可以实现这个需求!我们只需要把三个排序规则整合到排序的key函数中,同时先处理每个子元组的内部字母序排列,就能得到你想要的结果。
具体实现代码
original_list = [(('milk',), 5), (('milk', 'eggs'), 3), (('yogurt', 'milk'), 3), (('eggs',), 3), (('yogurt',), 3), (('milk', 'eggs', 'yogurt'), 2), (('milk', 'bread'), 2), (('milk', 'cheese'), 2), (('yogurt', 'eggs'), 2), (('bread',), 2), (('cheese',), 2)] # 第一步:先把每个商品组合子元组按字母序排序 processed_list = [(tuple(sorted(items)), count) for items, count in original_list] # 第二步:按三个规则完成整体排序 sorted_result = sorted(processed_list, key=lambda x: (-x[1], -len(x[0]), x[0])) print(sorted_result)
排序逻辑拆解
我们来逐个解释key函数里的三个维度:
-x[1]:针对元组的第二个值(数量)做降序排序。因为Python的sorted默认是升序,给数值取负后,大的数量会对应更小的负数,自然排在前面。-len(x[0]):针对商品子元组的元素数量做降序排序,同样用取负的方式实现降序逻辑,元素多的组合会优先排列。x[0]:针对已经排好字母序的商品子元组做升序排序,这样字母靠前的组合会排在同层级的前面。
运行代码后,输出结果完全匹配你的预期:
[(('milk',), 5), (('eggs', 'milk'), 3), (('milk', 'yogurt'), 3), (('eggs',), 3), (('yogurt',), 3), (('eggs', 'milk', 'yogurt'), 2), (('bread', 'milk'), 2), (('cheese', 'milk'), 2), (('eggs', 'yogurt'), 2), (('bread',), 2), (('cheese',), 2)]
补充说明
如果你只需要在排序时参考子元组的字母序,不需要修改原始子元组的内容,也可以把内部排序逻辑直接写到key里,但这样输出的子元组会保留原始顺序。而你的预期输出里子元组本身是按字母序排列的,所以先预处理子元组的方式更贴合需求。
内容的提问来源于stack exchange,提问作者pancakes
相关产品推荐
相关产品推荐

