函数将正数列表排序为 return 奇数在前,偶数在后

function to sort a list of positive numbers to return odd numbers first and even numbers last

我想编写一个函数,它接受一个数字列表(正整数)和 returns 一个排序数字列表,奇数在前,偶数在后

例如:

my_sort([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) => [1, 3, 5, 7, 9, 2, 4, 6、8、10]

my_sort([1, 2]) => [1, 2]

my_sort([2, 1]) => [1, 2]

my_sort([3, 3, 4]) => [3, 3, 4]

my_sort([90, 45, 66]) => [45, 66, 90]'''

这是我的代码

def my_sort(numbers):
    a = [n for n in numbers if n % 2 != 0]
    b = [n for n in numbers if n % 2 == 0]
    new_num = b + a
    for m in numbers:
        if a and b:
            return new_num
        else:
            return "Invalid sorted output"

所有测试均未通过。我是编程新手 python。所以如果有人能帮助我,我将不胜感激。

这是单元测试

import unittest

class MySortTestCases(unittest.TestCase):
    def setUp(self):
        self.result1 = my_sort([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        self.result2 = my_sort([1, 2])
        self.result3 = my_sort([2, 1])
        self.result4 = my_sort([3, 3, 4])
        self.result5 = my_sort([90, 45, 66])

    def test_output_1(self):
        self.assertEqual(self.result1,  [1, 3, 5, 7, 9, 2, 4, 6, 8, 10],
        msg='Invalid sorted output')

    def test_output_2(self):
        self.assertEqual(self.result2,  [1, 2], msg='Invalid sorted    
        output')

    def test_output_3(self):
        self.assertEqual(self.result3,  [1, 2], msg='Invalid sorted  
        output')

    def test_output_4(self):
        self.assertEqual(self.result4,  [3, 3, 4], msg='Invalid sorted
        output')

    def test_output_5(self):
        self.assertEqual(self.result5,  [45, 66, 90], msg='Invalid
        sorted output')

您可以将列表分成奇数和偶数,然后对两者进行排序并连接两个列表。

def my_sort(numbers):
    odd  = [n for n in numbers if n % 2 != 0]
    even = [n for n in numbers if n % 2 == 0]
    return sorted(odd) + sorted(even)

看到这个

>>> my_sort([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

但是使用键函数可以避免构造拆分列表:

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers.sort(key=lambda v: (v%2==0, v))
>>> numbers
[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

这使用一个关键函数对列表进行排序,该函数 returns 如果 v 是奇数则为 (0, v),如果 v 为偶数则为 (1, v)。这会导致奇数在升序排序中出现在偶数之前。

可以转化为函数:

def my_sort(numbers):
    return sorted(numbers, key=lambda v: (v%2==0, v))

所以,我继续抓取您的代码并自己做了一些测试以查看实际输出。您的代码目前实际上并未对列表进行排序。它只把偶数放在第一位,奇数放在第二位。这听起来也不是你想要的。

>>> my_sort([4, 5, 7, 1, 2, 6, 3])
[4, 2, 6, 5, 7, 1, 3]
>>> my_sort([1, 2])
[2, 1]

这些是我使用 Python 解释器 运行 编译你的代码得到的输出。如您所见,偶数首先是未排序的,然后是奇数,也是未排序的。这只与您创建 new_num 列表的方式有关。您有 new_num = b + a,但您通过查找所有偶数 b = [n for n in numbers if n % 2 == 0] 创建了 b,并通过查找所有奇数 a = [n for n in numbers if n % 2 != 0] 创建了 a% return 是余数。所以,如果一个数能被 2 整除它 returns 0 这意味着它是偶数。因此,您可以翻转 ab 的分配,或者在将它们加在一起时翻转,因此 a 是第一个,b 是第二个。

至于没有排序的个别块。 Python 有一个内置的排序函数,您可以在列表 sorted(my_list) 上调用该函数,return 是该列表的排序版本。所以,如果你只是 运行 在你的 ab 上,当你将它们加在一起创建你的 new_num 列表时,每个数字应该排序得很好.

您的 for 循环末尾的 if 语句也无法正常工作。给出一个已经排序的列表只是 returns 给定的列表。您的代码在这里:

for m in numbers:
    if a and b:
        return new_num
    else:
        return "Invalid sorted output"

这是循环遍历给定的原始列表,如果 ab 存在,则 return 是 new_num。由于 ab 将始终存在,因此将始终存在 return new_num 而永远不会是 "Invalid sorted output" 语句。您需要确保正在检查 numbers 列表是否已按照函数的预期输出进行排序。我的建议是检查 new_num 是否与 numbers.

相同

只需使用 sorted 两次。首先对列表进行排序,然后使用 key 参数再次按奇数排序,然后按偶数排序。

x = [3,5,4,1,6,8,10,2,9,7]

sorted(sorted(x), key=lambda x: (x+1)%2)
# returns:
# [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

这应该有效...如果您加入 Andela,这很有意义。

def my_sort(theNumbers):
#pass
evenNumbers=[]
oddNumbers=[]

#CHECK IF EVEN OR ODD THEN STORE THEN SEPARATE
for i in theNumbers:
    if i%2==0:
        evenNumbers.append(i)
    else:
        oddNumbers.append(i)
#print (evenNumbers)

#SORT DEM LISTS
evenNumbers.sort()
oddNumbers.sort()
#print (evenNumbers)

#join the two
oddNumbers+=evenNumbers
print (oddNumbers)


#my_sort([11111, 1, 11, 979749, 1111, 1111])

此代码应该有效:

def sort_integers(list_of_integers):     
        odd_numbers = [n for n in list_of_integers if n%2!=0]
        odd_numbers = sorted(odd_numbers, reverse = True)
        print(odd_numbers)

        even_numbers = [x for x in list_of_integers if x%2 == 0]
        even_numbers = sorted(even_numbers, reverse = True)

        print(even_numbers)

        new_sorted_list  = even_numbers + odd_numbers
        print(new_sorted_list)

此代码将在不创建临时列表的情况下对偶数和奇数进行排序。

</p> <pre><code>def segregateEvenOdd(arr, index=0, iterations=0): if iterations == len(arr): return arr if arr[index]%2 == 0: arr.append(arr[index]) arr.pop(index) return segregateEvenOdd(arr, index, iterations+1 ) if arr[index]%2 != 0: return segregateEvenOdd(arr,index+1,iterations+1) arr = [ 2, 3, 9, 45, 2, 5, 10, 47 ] output = segregateEvenOdd(arr) print(output) # Output # [3, 9, 45, 5, 47, 2, 2, 10]