用于对正数列表进行排序,以便首先返回奇数,最后返回偶数

时间:2017-03-02 00:47:54

标签: python python-unittest

我想写一个函数,它接受一个数字列表(正整数)并返回一个排序数字列表,这样奇数就先出现,偶数就是最后一个

例如:

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')

6 个答案:

答案 0 :(得分:4)

你可以通过将列表拆分为奇数和偶数然后对两者进行排序并连接两个列表来实现。

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]

这使用一个键函数对列表进行排序,如果v是奇数,则返回元组(0,v),如果是偶数则返回(1,v)。这会导致奇数以偶数排序的偶数出现。

它可以变成一个函数:

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

答案 1 :(得分:0)

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

>>> 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并通过查找所有奇数b = [n for n in numbers if n % 2 == 0]来创建a来创建a = [n for n in numbers if n % 2 != 0]%返回余数。因此,如果一个数字可被2整除,则返回0,这意味着它是偶数。因此,您可以翻转ab的作业,也可以在将它们添加到一起时翻转,因此a是第一个,b是第二个。

对于未分类的单个块。 Python有一个内置的排序函数,你可以在列表sorted(my_list)上调用它返回该列表的排序版本。因此,如果您只是在ab上将它们添加到一起创建new_num列表时运行,那么每个列表的数字应该排序很好。

你的for循环内的if语句也无法正常工作。给出已排序的列表只返回给定的列表。你的代码在这里:

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

这将循环显示给定的原始列表,如果new_numa存在,则返回b。由于ab将始终存在,因此始终会返回new_num而不会返回"Invalid sorted output"语句。您需要确保检查numbers列表是否已按功能的预期输出排序。我的建议是检查new_num是否与numbers相同。

答案 2 :(得分:0)

只需使用// file draggable-processing.php: <? $aSequence = explode('&',$_POST['data']); for($i = 0; $i<count($aSequence);$i++){ preg_match('/=([a-z0-9]*)$/', $aSequence[$i], $treffer); echo($treffer[1]."\n"); } 两次。首先对列表进行排序,然后再按奇数排序,然后使用sorted参数。

key

答案 3 :(得分:0)

这应该有用......如果你加入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])

答案 4 :(得分:0)

此代码将对偶数和奇数进行排序,而不会创建临时列表。

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]

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]

答案 5 :(得分:-1)

此代码应该有效:

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)