2017-10-04 77 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)