Python. Если в списке есть одинаковые числа, то не могу сортировать через min

Рейтинг: 0Ответов: 3Опубликовано: 11.06.2023

Если в списке есть одинаковые числа, то сортировка через min не работает. С max вроде все нормально работает, а с min нет. Подскажите, пожалуйста, из-за чего может так происходить? может проблема в index?

  • 1 Вариант

    a = [56,54,85,61,0,2,9,5,74,0]
    n = len(a) 
    for i in range(n):
        k = a.index(min(a[i:]))
        a[i],a[k] = a[k],a[i]
    print(a)
    #результат [54, 85, 61, 56, 2, 9, 5, 74, 0, 0]
    
  • 2 Вариант

    a = [56,54,85,61,0,2,9,5,74]
    n = len(a) 
    
    for i in range(n):
        k = a.index(min(a[i:]))
        a[i],a[k] = a[k],a[i]
    print(a)
    #результат [0, 2, 5, 9, 54, 56, 61, 74, 85]
    

Ответы

▲ 2
a = [56, 54, 85, 61, 0, 2, 9, 5, 74, 0]
n = len(a)
for i in range(n):
    min_val = min(a[i:])
    min_idx = a.index(min_val, i)  # Ищем индекс минимального элемента среди элементов начиная с индекса i
    a[i], a[min_idx] = a[min_idx], a[i]
print(a)
# Результат [0, 0, 2, 5, 9, 54, 56, 61, 74, 85]

Вместо использования функции index(), вы можете создать подсписок a[i:] и найти минимальный элемент в нем с помощью функции min()

▲ 1

После первого перехода циклом for будет все так, как вы ожидали — минимальный элемент будет в начале списка:

[0, 56, 54, 85, 61, 2, 9, 5, 74, 0]

В последующих шагах min(a[i:]) найдет значение 0 (на последней позиции среза a[i:]), что хорошо, НО

затем вы ищете это значение (0) в целом списке а:

a.index(min(a[i:]))

Значит, оно будет вычисляться как a.index(0), найдет 0 сразу в начале списка, и вы получите индекс этого ноля, а не индекс второго ноля.


Исправление:

Ищите индекс элемента не в целом списке, а только с позиции i, т.е. вместо

k = a.index(min(a[i:]))

примените

k = a.index(min(a[i:]), i)
▲ 0

Код, который вам нужен:

a = [56,54,85,61,0,2,9,5,74,0]
    print(sorted(a))

Сортирует по возрастанию! Намного легче и удобнее!