我的python选择排序有什么问题?

时间:2015-02-12 02:44:17

标签: python indexing

我无法弄清楚为什么python程序产生以下输出:

c:\Python Programs>selection_sort.py

[7, 4, 2, 9, 6]

[2, 4, 7, 9, 6]
[2, 6, 7, 9, 4]
[2, 6, 4, 9, 7]
Traceback (most recent call last):
  File "J:\Python Programs\Python Practice\selection_sort.py", line 11, in <modu
le>
    num_list[i], num_list[min_num] = num_list[min_num], num_list[i]
IndexError: list index out of range

c:\Python Programs>

我认为我理解列表索引超出范围部分,但我不确定当i = 1时为什么6成为第二个元素。机器是否读取了我的if语句?

以下是代码:

num_list = [7,4,2,9,6]
len_num_list = len(num_list)
print num_list
print""#print empty string to separate the original list from the following iterations 
for i in range(0,len_num_list):
    min_num = min(num_list[i:]) #finds minimum number in list to the right of i
    if min_num>num_list[i]:
        min_num = num_list[i]
    num_list[i], num_list[min_num] = num_list[min_num], num_list[i]
    print num_list  

2 个答案:

答案 0 :(得分:1)

首先,让我们在你的代码段中注意:

min_num = min(num_list[i:]) #finds minimum number in list to the right of i
if min_num>num_list[i]:
    min_num = num_list[i]

if 永远不会匹配 - 因为min_num是以num_list[i]开头的子列表的最小值,它不能在任何情况下,都可能比后者更大。

所以,丢失这三个陈述中的最后两个 - 它们与检查if 2+2 != 4:一样有用: - )。

接下来,请注意,您并不希望min_num成为(这是您对min的调用所给出的) - 您想要它成为列表中的索引,以便执行交换:

num_list[i], num_list[min_num] = num_list[min_num], num_list[i]

但是尝试通过index方法将值转换为索引是一条非常不确定的路径:如果输入列表可以有任何重复项,index将始终找到它们中的第一个,并且这可能很可能纠缠你了。我个人会选择不去那里。

而是考虑通过key=的{​​{1}}功能使用相应的找到最小索引的更直接路径!即:

min

如果您不熟悉许多Python内置插件(for i in range(0,len_num_list): min_ind = min(range(i, len_num_list), key=lambda j: num_list[j]) num_list[i], num_list[min_ind] = num_list[min_ind], num_list[i] print num_list key=min,...)的max功能,那么它真的是一个好学的东西。

对某个序列进行排序(或给出最小值,或最大值,或者),在将序列中的每个项目传递给您作为sorted传递的“密钥提取函数”之后进行比较。在这里,你想要“最小的索引”,你可以通过选择每个索引的相应查找key=的最小索引到列表中来获得。

我个人不喜欢lambda并且可能会使用key=,但这也不是非常易读 - 最可读的总是使用key=numlist.__getitem__(并且我会对该交换功能执行相同操作),例如..:

def

我觉得这是完成这项任务最可读和最优雅的方法。

答案 1 :(得分:0)

问题是min(num_list[i:])从列表中返回一个数字,而不是该列表的索引。您可以使用index方法获取与min(num_list[i:])对应的索引。因此,请尝试:

num_list = [7,4,2,9,6]
len_num_list = len(num_list)
print num_list
print""#print empty string to separate the original list from the following iterations_
for i in range(0,len_num_list):
    min_num = min(num_list[i:]) #finds minimum number in list to the right of i
    j = num_list.index(min_num)
    if min_num>num_list[i]:
        min_num = num_list[i]
    num_list[i], num_list[j] = num_list[j], num_list[i]
    print num_list

这会产生输出:

[7, 4, 2, 9, 6]

[2, 4, 7, 9, 6]
[2, 4, 7, 9, 6]
[2, 4, 6, 9, 7]
[2, 4, 6, 7, 9]
[2, 4, 6, 7, 9]