2015-06-14 3 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_] 

Это не очень эффективно, конечно.

Обратите внимание, что следующая проблема, с которой вы столкнетесь, заключается в том, что вы выгрузили copy, прежде чем завершите все итерации range(len(lst)). Вместо этого вы можете заменить этот цикл на 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_) 
Смежные вопросы