冰冻集的医生说:
The frozenset type is immutable and hashable — its contents cannot be altered after it is created; it can therefore be used as a dictionary key or as an element of another set.
但是,for python sets的文档显示:
Since sets only define partial ordering (subset relationships), the output of the list.sort() method is undefined for lists of sets.
这让我不禁要问:为什么会这样?如果我想按集合内容对集合列表进行排序,我该怎么做呢?我知道扩展intbitset:https://pypi.python.org/pypi/intbitset/2.3.0有一个函数,用于返回表示集合内容的位序列。python集合有什么可比的吗?在
举个例子:假设您想按每个集合的“第一个元素”对集合列表进行排序。问题是Python集或frozensets没有“第一个元素”,它们没有自己的顺序感。集合是没有重复元素的无序集合。在
此外,} operator between items 。在
list.sort()
对列表进行适当排序,using only the ^{如果您只使用
a.sort()
而不传递任何key
参数,那么说set_a < set_b
(或set_a.__lt__(set_b)
)是不够的。我的意思是set_a.__lt__(set_b)
是一个子集运算符。(a
是b
的子集吗?)。正如@Blender提到的,在你的问题中提到的,这提供了部分而不是全部的排序,这不足以定义序列中包含的集合。在从文件中:
你可以把一个
key
传递给sort()
,它只是不能在内部引用任何与集合的“排序”有关的内容,因为记住没有。在元组、列表、字符串等具有自然的字典序,并且可以进行排序,因为可以始终比较给定集合中的两个元素。也就是说,}。在
a < b
,b < a
,或{两个集合之间的自然比较是}是{}的一个子集,这就是Python中表达式{}的实际作用。文档中所说的“部分排序”是指并非所有的集合都是可比较的。以以下几组为例:
a <= b
平均值{a
是b
的子集吗?不,b
是a
的子集吗?不,他们是平等的吗?不,如果你根本无法比较,你显然无法对它们进行分类。在对集合进行排序的唯一方法是比较函数是否可以比较任何两个元素(a total order)。这意味着您仍然可以使用上面的子集关系对集合进行排序,但是您必须确保所有集合都是可比较的(例如
[{1}, {1, 2, 4}, {1, 2}]
)。在做你想做的最简单的方法就是把每个单独的集合转换成你实际上可以比较的东西。基本上,对于一些简单的函数
^{pr2}$f(a) <= f(b)
(其中<=
很明显)。这是通过key
关键字参数完成的:对
[f(set1), f(set2), f(set3)]
进行排序,并将得到的排序应用于[set1, set2, set3]
。在相关问题 更多 >
编程相关推荐