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函数。如果排序键属于不同的类型,旧版本也可能会导致奇怪的结果(这似乎不太有用,但无论如何)。甚至更干净。非常感谢。