python:有没有一种方法可以对列表中的多个值的元组进行排序?

时间:2020-09-29 10:08:53

标签: python list sorting tuples

我有以下元组列表:

[(('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)]

我需要通过减少第2个值,然后减少第一个值项的数量,然后按字母顺序对它们进行排序。第一个和第二个要求,我已经完成了。如您所见,它们各自的第二个值正在减小,然后减小第一个值项。我唯一的问题是第一值元组中的项目列表。我不能按字母顺序排列它们。

我的预期输出应该是:

[(('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)]

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

lst = [(('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)]

from pprint import pprint
pprint(sorted(((tuple(sorted(a)), b) for a, b in lst), key=lambda k: (-k[1], -len(k[0]), k[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)]

注意:我认为您的初始列表未排序。

答案 1 :(得分:1)

组是不可变的,因此您需要创建新组:

lst = [(('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)]

out = [(tuple(sorted(items)), number) for items, number in lst]

print(out)

给予:

[(('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)]

这是您已经做完所有事情以获得问题中显示的排序列表之后的内容(第一和第二要求)。