2013-10-05 98 views
1

如果我有一个列表,其中所有的值都是唯一的,代码运行良好。但是,如果列表中存在重复值,则在找到下一次迭代的最小值时,它会从整个列表中拉取,而不是从列表的剩余部分中拉出。选择排序的重复问题

for n in range(0,len(lst)): 
    a = min(lst[n:]) #minimum value within remainder of set 
    i = lst.index(a) #index value for minimum value within remainder of set  

    temp = lst[n] 
    lst[n] = a 
    lst[i] = temp 

结果是这样的:

lst = [6, 8, 9, 1, 3, 4, 7, 5, 4] 

[1, 8, 9, 6, 3, 4, 7, 5, 4] 
[1, 3, 9, 6, 8, 4, 7, 5, 4] 
[1, 3, 4, 6, 8, 9, 7, 5, 4] 
[1, 3, 6, 4, 8, 9, 7, 5, 4] 
[1, 3, 6, 8, 4, 9, 7, 5, 4] 
[1, 3, 6, 8, 9, 4, 7, 5, 4] 
[1, 3, 6, 8, 9, 7, 4, 5, 4] 
[1, 3, 6, 8, 9, 7, 5, 4, 4] 
[1, 3, 6, 8, 9, 7, 5, 4, 4] 

我在寻找它返回此:

[1, 3, 4, 4, 5, 6, 7, 8, 9] 

回答

1

n为4,下一个最低为4再次,但是lst.index()找到而不是第一个4

开始搜索从n的miminum ;该.index()方法需要第二个参数start,从哪里开始搜索:

i = lst.index(a, n)  

注意,Python可以分配给两个目标到位,无需使用临时的中间。 range()只有一个参数从0开始:

for n in range(len(lst)): 
    a = min(lst[n:]) 
    i = lst.index(a, n) 
    lst[n], lst[i] = a, lst[n] 

演示:

>>> lst = [6, 8, 9, 1, 3, 4, 7, 5, 4] 
>>> for n in range(0,len(lst)): 
...  a = min(lst[n:]) 
...  i = lst.index(a, n) 
...  lst[n], lst[i] = a, lst[n] 
... 
>>> lst 
[1, 3, 4, 4, 5, 6, 7, 8, 9] 
+0

如果不是事实,我必须限制在列表的范围[N:]做到这一点? – user2850240

+0

@ user2850240:不,您正在搜索所有'lst'。你可以切片和*然后*搜索; 'list [n:] .index(a)',但是.index()的第二个参数更有效率。 –