2015-06-14 53 views
0

我不明白爲什麼1和5打印三次。 (我知道我可以使用list.sort()方法。)Python3 - 排序列表

lst = [4,5,5,1,6,1] 
copy = lst.copy() 
sort = [] 
for i in range(len(lst)): 
    min_ = min(copy) 
    for k in copy: 
     if k == min_: 
      sort.append(min_) 
    copy.remove(min_) 
print(sort) 

回答

3

list.remove()去除第一發生的值,不是所有的這樣的值的。因此,你倆1值先加至sort,刪除這兩個1值中的一個,那麼剩下的1值再次添加到sort

>>> lst = [4,5,5,1,6,1] 
>>> copy = lst.copy() 
>>> sort = [] 
>>> min_ = min(copy) 
>>> min_ 
1 
>>> for k in copy: 
...  if k == min_: 
...   sort.append(min_) 
... 
>>> sort 
[1, 1] 
>>> copy.remove(min_) 
>>> copy 
[4, 5, 5, 6, 1] 
>>> min_ = min(copy) 
>>> min_ 
1 
>>> for k in copy: 
...  if k == min_: 
...   sort.append(min_) 
... 
>>> sort 
[1, 1, 1] 

你可以使用列表解析刪除所有值,通過本質上創建一個新的副本,排除要通過過濾刪除的值:

copy = [v for v in copy if v != min_] 

當然這不是非常有效。

請注意,您將遇到的下一個問題是,在完成所有range(len(lst))迭代之前,您已經清空了copy。您可以用while copy:循環代替該循環。

或者,你可以只添加第一匹配min_值來sort

for i in range(len(lst)): 
    min_ = min(copy) 
    for k in copy: 
     if k == min_: 
      sort.append(min_) 
      break 
    copy.remove(min_) 

break月初結束for循環。當然,你甚至不必循環地發現,最小值,這正是min()呼叫已經做了,這樣你就可以完全放棄它:

for i in range(len(lst)): 
    min_ = min(copy) 
    sort.append(min_) 
    copy.remove(min_)