我有以下元组列表:
[(('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)]
有没有办法做到这一点?
答案 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)]
这是您已经做完所有事情以获得问题中显示的排序列表之后的内容(第一和第二要求)。