元组、列表、字符串等具有自然的字典顺序并且可以排序,因为您始终可以比较给定集合的两个元素。也就是说,要么a < b
,b < a
,要么a == b
。
两个集合之间的自然比较是让a <= b
均值a
是 的子集b
,这就是表达式a <= b
在 Python 中的实际作用。文档中的“部分排序”意味着并非所有集合都具有可比性。以以下集合为例:
a = {1, 2, 3}
b = {4, 5, 6}
是a
的子集b
吗?不,是b
的子集a
吗?不,他们是平等的吗?不,如果您根本无法比较它们,那么您显然无法对它们进行排序。
您可以对集合进行排序的唯一方法是您的比较函数实际上可以比较任何两个元素(总顺序)。这意味着您仍然可以使用上述子集关系对集合集合进行排序,但您必须确保所有集合都是可比较的(例如[{1}, {1, 2, 4}, {1, 2}]
)。
做你想做的最简单的方法是将每个单独的集合转换成你实际可以比较的东西。基本上,对于一些简单的功能,您会这样做f(a) <= f(b)
(<=
很明显)f
。这是通过key
关键字参数完成的:
In [10]: def f(some_set):
... return max(some_set)
...
In [11]: sorted([{1, 2, 3, 999}, {4, 5, 6}, {7, 8, 9}], key=f)
Out[11]: [{4, 5, 6}, {7, 8, 9}, {1, 2, 3, 999}]
您正在排序[f(set1), f(set2), f(set3)]
并将生成的排序应用于[set1, set2, set3]
.