根据条件委派排序

时间:2012-03-30 22:00:08

标签: python sorting

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

2 个答案:

答案 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