按值

时间:2018-03-04 03:01:35

标签: python sorting hashmap set frozenset

冻结的文档说:

  

冻结类型是不可变的和可散列的 - 其内容在创建后不能更改;因此,它可以用作字典键或另一组的元素。

但是,python集的文档说:

  

由于sets只定义了部分排序(子集关系),因此未定义list.sort()方法的输出。

这让我问:为什么会这样?并且,如果我想按设置内容对集合列表进行排序,我该怎么做?我知道扩展intbitset:https://pypi.python.org/pypi/intbitset/2.3.0,有一个返回表示设置内容的位序列的函数。是否有类似于python集的东西?

2 个答案:

答案 0 :(得分:3)

元组,列表,字符串等具有自然的词典排序,并且可以进行排序,因为您始终可以比较给定集合的两个元素。也就是说,a < bb < aa == b

两组之间的自然比较是a <= b意味着ab的一个子集,这就是表达式a <= b在Python中的实际作用。文档的含义是&#34;部分排序&#34;并非所有套装都具有可比性。例如,以下几组:

a = {1, 2, 3}
b = {4, 5, 6}

ab的子集吗?不是。ba的子集吗?不,他们是否平等?不。如果你根本无法对它们进行比较,你显然无法对它们进行排序。

你可以对一组集合进行排序的唯一方法是你的比较函数实际上可以比较任何两个元素(total order)。这意味着您仍然可以使用上述子集关系对集合集合进行排序,但您必须确保所有集合都具有可比性(例如[{1}, {1, 2, 4}, {1, 2}])。

执行所需操作的最简单方法是将每个单独的集合转换为您实际<​​em>可以进行比较的内容。基本上,对于一些简单的函数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]

答案 1 :(得分:3)

举一个例子:说你想按&#34;第一个元素&#34;排序一组集合。每一组。问题在于Python设置或者冻结没有第一个元素。&#34;他们没有自己的排序感。集合是无序集合,没有重复元素。

此外,list.sort()对列表进行了排序,using only the < operator between items

如果您只使用a.sort()而未传递任何key参数,则说set_a < set_b(或set_a.__lt__(set_b)不足。如果不足,我的意思是set_a.__lt__(set_b)子集运算符。 (ab的子集吗?)。正如@Blender所提到并在你的问题中引用的那样,这提供了部分而不是总排序,这不足以定义序列保存集合的内容。

来自文档:

  

set < other:测试该集合是否是其他的适当子集   是,set <= otherset != other

可以key传递给sort(),它只是不能引用任何关于&#34;命令&#34;内部的集合,因为记住 - 没有。

>>> 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}]