按值排序python集列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按值排序python集列表相关的知识,希望对你有一定的参考价值。

冻结的文档说:

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

但是,python集的文档说:

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

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

答案

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

两组之间的自然比较是a <= b意味着ab的一个子集,这是a <= b在Python中实际做的表达。 “部分排序”的文档意味着并非所有集合都具有可比性。举例来说,以下几组:

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

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

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

另一答案

举一个例子:假设您想按每组的“第一个元素”对集合列表进行排序。问题是Python set或frozensets没有“第一个元素”。他们没有自己的排序感。集合是无序集合,没有重复元素。

此外,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(),它只是无法在内部引用任何关于集合的“排序”,因为记住 - 没有。

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

以上是关于按值排序python集列表的主要内容,如果未能解决你的问题,请参考以下文章

python按值的长度对字典进行排序

如何按值对计数器进行排序? - Python

Ruby - 按值按降序排序哈希值

python [按值排序Dict]按值排序Dict

Java 8 流映射到按值排序的键列表

Angular 4 Firebase angularfire 按值对列表进行排序