Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于条件的委托排序_Python_Sorting - Fatal编程技术网

Python 基于条件的委托排序

Python 基于条件的委托排序,python,sorting,Python,Sorting,我有一个对象列表,这些对象是根据一些复杂的条件预先排序的,例如,不能用attrgetter轻松复制。如果它们都有属性:part\u of\u subset,我想进一步按字母顺序对它们的子集进行排序 如何在不重新定义字母排序函数的情况下执行此操作 def cmp(a, b): if a.part_of_subset and b.part_of_subset: # sort alphabetically -- must I duplicate alphabetic sort

我有一个对象列表,这些对象是根据一些复杂的条件预先排序的,例如,不能用
attrgetter
轻松复制。如果它们都有属性:
part\u of\u subset
,我想进一步按字母顺序对它们的子集进行排序

如何在不重新定义字母排序函数的情况下执行此操作

def cmp(a, b):
    if a.part_of_subset and b.part_of_subset:
        # sort alphabetically -- must I duplicate alphabetic sort code?
    return 0

在某些条件下,只需说出
return cmp(a,b)
即可将排序委托给另一个函数。我指的是内置Python函数
cmp
,而不是您的
cmp

,虽然您可以定义用于排序的比较函数,但通常建议使用键函数。对于您的应用程序,这个键函数应该为所有应该保持不变的内容返回相同的值,并为其余内容返回排序键。范例

def my_key(a):
    if a.part_of_subset:
        return 0,
    return 1, a.sort_key

collection.sort(key=my_key)
请注意,已排序的子集将在已排序的元素之后分组到一个块中


已编辑:为了摆脱
sort\u key
可能永远不会是
None
的限制,并使代码在Python 3中工作,我更新了key函数。如果排序键属于不同的类型,旧版本也可能会导致奇怪的结果(这似乎不太有用,但无论如何)。

甚至更干净。非常感谢。