挑战如下:
你将得到一个数字数组,你必须将奇数按升序排序,而将偶数保留在原来的位置。
[7, 1] => [1, 7]
[5, 8, 6, 3, 4] => [3, 8, 6, 5, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] => [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]
我的代码逻辑是:该函数接受一个源数组(src_arr
),我创建了一个仅包含奇数的新数组,并在odd_arr
中对它们进行排序,在for循环中,if语句检查src_arr
中的每个数字是否为奇数,并将其替换为odd_arr
中对应的排序后的奇数。
def sort_array(src_arr):
odd_arr = sorted([num for num in src_arr if num%2 != 0])
i = 0
for num in src_arr:
if num%2 != 0:
src_arr[src_arr.index(num)] = odd_arr[i]
i += 1
return src_arr
print(sort_array([5, 3, 2, 8, 1, 4]))
输入是[5, 3, 2, 8, 1, 4]
,输出应该是[1, 3, 2, 8, 5, 4]
,但是我一直得到与输入完全相同的输出,我做了一个pdb.trace()
,一切正常,直到输入列表中的数字1,我不明白为什么它没有给出正确的输出。
4条答案
按热度按时间icomxhvb1#
通过将
odd_arr
设为奇数排序列表上的迭代器,并在需要时调用next(odd_arr)
,甚至可以稍微简化代码,而无需手动管理索引:gdx19jrr2#
您选择在
src_arr
上运行for
-循环,并在odd_arr
上维护手动索引i
。就我个人而言,我发现在
odd_arr
上运行for
-loop并在src_arr
上维护手动索引i
要简单得多。这是因为我们希望按顺序查看
odd_arr
的每个元素,所以一个简单明了的for
-循环是合适的;但是src_arr
是我们要跳过元素的数组,所以维护我们自己的索引i
并跳过我们想手动跳过的元素更容易。hc8w905p3#
另一种查看方法是更改原始数组,因此在用1替换5后,数字1有两个索引
只要您有一个拷贝,并在保持原始阵列完整的同时更改拷贝,就可以解决问题
z6psavjg4#
已经有一些很棒的答案贴出来了。这里还有一个选择--为了好玩。它的灵感也来自于之前的评论。