[英]Sorting a list of python sets by value
Frozenset文档说:
Frozenset类型是不可变的和可哈希的-创建后不能更改其内容; 因此,它可以用作字典键或用作另一个集合的元素。
但是,用于python集的文档说:
由于集合仅定义部分排序(子集关系),因此对于集合列表未定义list.sort()方法的输出。
这使我问:为什么会这样? 而且,如果我想按集合内容对集合列表进行排序,我该怎么做? 我知道扩展名intbitset: https ://pypi.python.org/pypi/intbitset/2.3.0,具有返回代表设置内容的位序列的功能。 python集有什么可比的吗?
元组,列表,字符串等具有自然的字典顺序,可以进行排序,因为您始终可以比较给定集合的两个元素。 也就是说, 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
进行f(a) <= f(b)
(其中<=
显而易见)。 这是通过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]
。
举个例子:说您想按每个集合的“第一个元素”对集合列表进行排序。 问题在于Python集或Frozensets没有“第一个元素”。 他们没有自己的顺序感。 集合是没有重复元素的无序集合。
此外, list.sort()
仅在items之间使用<
运算符对列表进行排序。
如果仅使用a.sort()
而不传递任何key
参数,则说set_a < set_b
(或set_a.__lt__(set_b)
)是不够的 。 不足以表示set_a.__lt__(set_b)
是子集运算符。 (是a
子集b
?)。 正如@Blender提到并在您的问题中提到的那样,这提供了部分排序而不是全部排序,这不足以定义什么序列保存这些集合。
从文档:
set < other
:测试set是否为other的适当子集,即set <= other
并set != other
。
您可以将一个key
传递给sort()
,它根本无法在内部引用与集合的“排序”有关的任何东西,因为请记住-没有。
>>> a = {2, 3, 1}
>>> b = {6, 9, 0, 1}
>>> c = {0}
>>> i = [b, a, c]
>>> i.sort(key=len)
>>> i
[{0}, {1, 2, 3}, {0, 9, 6, 1}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.