2012-03-30 68 views
2

我有一个对象列表,它根据一些复杂的标准进行了预先排序,例如,这些标准不容易与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 

回答

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的代码工作,我更新了关键作用。旧版本可能会导致奇怪的结果,这种情况下,排序键是不同类型的(这似乎不太有用,但无论如何)。

+0

即使更清洁。非常感激。 – ash 2012-03-30 22:20:34

1

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