我无法弄清楚为什么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
答案 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]