我对python有疑问。我必须以特定方式对随机数列表进行排序(不允许使用sort()
)。我试着解释一下:
我必须搜索最小的数字,并将此数字与列表中第一个位置的数字交换。
然后,我再次搜索最小的数字,但这次忽略了我的列表中的第一个数字,因为这个已经排序了。所以,我应该开始从第二个数字(索引1)到列表末尾搜索最小的数字。找到的最小数字应与列表中的第二个数字交换(因此索引1)。
我希望你理解我的问题。这是我到目前为止编写的代码,但是我收到错误和/或排序不正确。
array = random_integers(10,size=10)
my_list = list(array)
for i in range(len(my_list)):
print my_list
a = min(my_list[i:len(my_list)])
b = my_list.index(a)
my_list[i],my_list[b]=my_list[b],my_list[i]
print my_list
我认为我的范围存在问题,
存在问题a = min(my_list[i:len(my_list)])
我想搜索最小的数字,但不在整个列表中搜索我该怎么做?
答案 0 :(得分:3)
问题出现在这一行:
b = my_list.index(a)
因为这会在a
的所有中搜索my_list
的第一次出现。如果相同的数字出现两次,则b
将始终对应于最小的此类索引,该索引可能小于i
。因此,您最终可能会移动已经排序的数字。
要尝试的显而易见的事情是在调用my_list
之前切片index
:
my_list[i:].index(a)
但请注意,索引会返回0
和N-i
之间的值。我们想要i
和N
之间的数字。因此,请务必在结果中添加i
:
b = my_list[i:].index(a)+i
因此,修复目前存在的代码的最简单方法是:
for i in range(len(my_list)):
a = min(my_list[i:])
b = my_list[i:].index(a)+i
my_list[i], my_list[b] = my_list[b], my_list[i]
但请注意min
正在搜索my_list[i:]
中的所有项目,然后对index
的调用将再次遍历同一列表。您可以在一次遍历中找到b
,如下所示:
b = min(range(i, N), key=my_list.__getitem__)
演示:
import numpy as np
array = np.random.random_integers(10,size=10)
my_list = list(array)
N = len(my_list)
for i in range(N):
b = min(range(i, N), key=my_list.__getitem__)
my_list[i], my_list[b] = my_list[b], my_list[i]
print my_list
产量
[3, 10, 9, 6, 5, 3, 6, 8, 8, 4]
[3, 3, 9, 6, 5, 10, 6, 8, 8, 4]
[3, 3, 4, 6, 5, 10, 6, 8, 8, 9]
[3, 3, 4, 5, 6, 10, 6, 8, 8, 9]
[3, 3, 4, 5, 6, 10, 6, 8, 8, 9]
[3, 3, 4, 5, 6, 6, 10, 8, 8, 9]
[3, 3, 4, 5, 6, 6, 8, 10, 8, 9]
[3, 3, 4, 5, 6, 6, 8, 8, 10, 9]
[3, 3, 4, 5, 6, 6, 8, 8, 9, 10]
[3, 3, 4, 5, 6, 6, 8, 8, 9, 10]
答案 1 :(得分:0)
如果您想要列表中的最小数字,可以使用min()
。如果您想要列表的一部分,可以使用列表切片:my_list[1:]
。将两者放在一起,您就可以从列表的一部分得到最小的数字。但是,您不需要这样做,因为您可以从列表中.pop()
代替。
sorted_list = []
while my_list:
n = min(my_list)
sorted_list.append(my_list.pop(my_list.index(n)))
如果您使用的是numpy数组,那么您可以使用my_list.index(min(my_list))
方法代替.argmin()
。
虽然这种类型的排序有利于介绍,但效率不高。您可能需要考虑查看合并排序,以及Python内置的timsort。