我有一个对象列表,这些对象是根据一些复杂的标准进行预先排序的,这些标准不容易与attrgetter
重复。我想按字母顺序对它们的子集进行进一步排序,如果它们都具有属性:part_of_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
答案 0 :(得分:4)
虽然可以定义用于排序的比较函数,但通常建议使用键功能。对于您的应用程序,此键函数应该为应该保持不变的所有内容返回相同的值,并为其余的返回排序键。实施例
def my_key(a):
if a.part_of_subset:
return 0,
return 1, a.sort_key
collection.sort(key=my_key)
请注意,已排序的元素之后,已排序的子集将组合在一起。
已编辑:要摆脱sort_key
可能永远不会None
的限制,并使代码在Python 3中运行,我更新了关键功能。在排序键具有不同类型的情况下,旧版本也可能导致奇怪的结果(这似乎不太有用,但无论如何)。
答案 1 :(得分:1)
只需说出return cmp(a, b)
,您就可以在特定条件下将排序委派给其他功能。我指的是内置Python函数cmp
,而不是cmp
。