【问题标题】:Get even numbers and odd numbers in order in list在列表中按顺序获取偶数和奇数
【发布时间】:2017-10-04 21:24:00
【问题描述】:

一个例子:

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. []

【问题讨论】:

  • 如果第一个数字是偶数,您只需跳过它并递归其余部分。因此,您要删除所有偶数,而不是将它们移到后面。

标签: python python-3.x


【解决方案1】:

您可以将 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]

【讨论】:

    【解决方案2】:

    这是一个相当易读的版本,它使用 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)
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2019-09-10
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多