Как я могу очистить эту функцию выбора сортировки в Python? - PullRequest
1 голос
/ 10 мая 2019

Я только что прошел и преобразовал функцию выбора сортировки, написанную на C ++, в Python.

Мне кажется, что я слишком много кодирую, как программист на С, тогда как я знаю, что в Python есть много встроенных функций, которые можно использовать для циклов for, которые бы его очищали.Я просто не уверен, с чего начать.

Что я могу изменить в этом коде, чтобы сделать его более идиоматичным?

def selection_sort(A):
    for i in range(0, len(A) - 1):
        min_idx = i
        for j in range(i + 1, len(A)):
            if A[j] < A[min_idx]:
                min_idx = j
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Код на самом деле уже выглядит очень питонно! Примечательно, что вы меняете значения с помощью идиомы x, y = y, x, это очень приветствуется в Python.

И Python2, и Python3:

  • range(0, x) эквивалентно range(x)
  • При желании вы можете найти индекс минимального значения с помощью A.index(min(A[i:])). Это в значительной степени зависит от вкуса, и с очень большими списками это будет медленнее. ИМХО выглядит красиво и лаконично:
def selection_sort(A):
    for i in range(0, len(A) - 1):
        min_idx = A.index(min(A[i:]))
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

python2:

  • range создает список - итерирует по всем элементам - сразу, xrange создает ленивый генератор - итерирует по элементам только тогда, когда к ним обращаются - это предпочтительно и часто быстрее (это не быстрее во фрагменте Вы предоставили).

Общие сведения:

  • В профессиональной проверке кода вам может потребоваться предоставить строку документации, примерно такую ​​же как:
def selection_sort(A):
    """selection_sort performs an unstable in-place sort on A

    A -- list to be sorted.

    Returns A, sorted.
    """
    for i in range(0, len(A) - 1):
        min_idx = i
        for j in range(i + 1, len(A)):
            if A[j] < A[min_idx]:
                min_idx = j
        if min_idx != i:
            A[i], A[min_idx] = A[min_idx], A[i]

    return A

Источники:

0 голосов
/ 10 мая 2019

В списках есть функция sort (), которая сделает всю работу за вас.

...