我列表中特定部分的最小数字

时间:2014-05-04 11:47:56

标签: python sorting min

我对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)])     

我想搜索最小的数字,但不在整个列表中搜索我该怎么做?

2 个答案:

答案 0 :(得分:3)

问题出现在这一行:

b = my_list.index(a)

因为这会在a所有中搜索my_list的第一次出现。如果相同的数字出现两次,则b将始终对应于最小的此类索引,该索引可能小于i。因此,您最终可能会移动已经排序的数字。

要尝试的显而易见的事情是在调用my_list之前切片index

my_list[i:].index(a)

但请注意,索引会返回0N-i之间的值。我们想要iN之间的数字。因此,请务必在结果中添加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。