2012-03-30 73 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