函数将正数列表排序为 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 这意味着它是偶数。因此,您可以翻转 a
和 b
的分配,或者在将它们加在一起时翻转,因此 a
是第一个,b
是第二个。
至于没有排序的个别块。 Python 有一个内置的排序函数,您可以在列表 sorted(my_list)
上调用该函数,return 是该列表的排序版本。所以,如果你只是 运行 在你的 a
和 b
上,当你将它们加在一起创建你的 new_num
列表时,每个数字应该排序得很好.
您的 for 循环末尾的 if 语句也无法正常工作。给出一个已经排序的列表只是 returns 给定的列表。您的代码在这里:
for m in numbers:
if a and b:
return new_num
else:
return "Invalid sorted output"
这是循环遍历给定的原始列表,如果 a
和 b
存在,则 return 是 new_num
。由于 a
和 b
将始终存在,因此将始终存在 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]
我想编写一个函数,它接受一个数字列表(正整数)和 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 这意味着它是偶数。因此,您可以翻转 a
和 b
的分配,或者在将它们加在一起时翻转,因此 a
是第一个,b
是第二个。
至于没有排序的个别块。 Python 有一个内置的排序函数,您可以在列表 sorted(my_list)
上调用该函数,return 是该列表的排序版本。所以,如果你只是 运行 在你的 a
和 b
上,当你将它们加在一起创建你的 new_num
列表时,每个数字应该排序得很好.
您的 for 循环末尾的 if 语句也无法正常工作。给出一个已经排序的列表只是 returns 给定的列表。您的代码在这里:
for m in numbers:
if a and b:
return new_num
else:
return "Invalid sorted output"
这是循环遍历给定的原始列表,如果 a
和 b
存在,则 return 是 new_num
。由于 a
和 b
将始终存在,因此将始终存在 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]