2017-10-04 32 views
1

一個例子:獲取偶數和奇數號碼順序列表

def get_evens_at_back(a_list): 
    if not a_list: 
     return [] 
    if a_list[0] % 2 == 1: 
     return [a_list[0]] + get_evens_at_back(a_list[1:]) 
    return get_evens_at_back(a_list[1:]) 

    print("1.", get_evens_at_back([-1, 2, -3, 4, -2, 3, 5])) 
    print("2.", get_evens_at_back([1, 2, -3, 4, 7, 4, -6, 3, -1])) 
    print("3.", get_evens_at_back([-4, -2, 6, 8, 6, 2])) 
    print("4.", get_evens_at_back([-3, -1, 3, 1, 7, 9])) 
    print("5.", get_evens_at_back([])) 

輸出:

1. [-1, -3, 3, 5] 
2. [1, -3, 7, 3, -1] 
3. [] 
4. [-3, -1, 3, 1, 7, 9] 
5. [] 

我試圖獲得與列表中的所有奇數一個新的列表(排序順序)以及列表後面的列表中的所有偶數(按排序順序)。如果列表爲空,則該函數應返回一個空列表。我不確定如何解決該問題。

預期:

1. [-3, -1, 3, 5, -2, 2, 4] 
2. [-3, -1, 1, 3, 7, -6, 2, 4, 4] 
3. [-4, -2, 2, 6, 6, 8] 
4. [-3, -1, 1, 3, 7, 9] 
5. [] 
+0

如果第一個數字是偶數,那麼您只需跳過它並對其餘數字進行遞歸。所以你要刪除所有偶數,而不是將它們移到後面。 – Barmar

回答

3

可以使用sorted用2元組,首先把單號,然後通過數字的每個類別的大小排序:

>>> lst = [1, 2, -3, 4, 7, 4, -6, 3, -1] 
>>> sorted(lst, key=lambda x: (x % 2 == 0, x)) 
[-3, -1, 1, 3, 7, -6, 2, 4, 4] 
1

這裏有一個相當可讀的版本,它使用內置函數filter獲取單獨列表中的所有奇數/偶數值,對這些列表進行排序,然後將它們合併(使用列表+運算符):

def is_even(i): 
    return (i % 2) == 0 

def is_odd(i): 
    return (i % 2) != 0 

def get_evens_at_back(l): 
    odds = list(filter(is_odd, l)) 
    evens = list(filter(is_even, l)) 

    return sorted(odds) + sorted(evens)