вспомогательные функции Python и операторы возврата - PullRequest
1 голос
/ 22 апреля 2019

Функция, представленная ниже (sort_priority_0), сортирует список чисел, но ставит в очередь одну группу чисел, которая идет первой. Какова цель кортежа в операторе возврата?

numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}

def sort_priority_0(values, group):
    def helper(x):
        if x in group:
            return 0, x
        return 1, x
    values.sort(key=helper)

python sort_priority_0.py 
[2, 3, 5, 7, 1, 4, 6, 8]

Если я изменяю функцию и удаляю кортеж, сортировка выполняется в порядке возрастания. Пожалуйста, объясните, почему поведение так сильно отличается от и без кортежа в операторе return?

def sort_priority_1(values, group):
    def helper(x):
        if x in group:
            return x
        return x
    values.sort(key=helper)

python sort_priority.py 
[1, 2, 3, 4, 5, 6, 7, 8]

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

Параметр key в sort принимает функцию. Вы можете думать об этом следующим образом: если предоставляется key, то итерация ввода будет отсортирована , как если бы key был применен к каждому элементу .

tuples сортируются по первому элементу, затем по второму и т. Д. В этом случае функция key преобразует все элементы в итерируемой для сортировки в tuples, где первый элемент равен 0, если число находится в группе приоритетов, и 1 в противном случае.

Это означает, что, поскольку sort по умолчанию возрастает, все номера приоритетов будут на первом месте, и они будут внутренне отсортированы в порядке возрастания.

Чтобы проиллюстрировать это, вы можете представить процесс следующим образом:

  1. Начните с [8, 3, 1, 2, 5, 4, 7, 6]
  2. Применить key, чтобы получить:
[(1, 8), (0, 3), (1, 1), (0, 2), (0, 5), (1, 4), (0, 7), (1, 6)]
  1. Сортируйте результат в порядке возрастания, чтобы получить:
[(0, 2), (0, 3), (0, 5), (0, 7), (1, 1), (1, 4), (1, 6), (1, 8)]
  1. Возьмите соответствующие элементы исходных данных (в этом случае второй элемент tuple, хотя из-за того, что он основан на индексе, исходные элементы не нужно восстанавливать из выходных данных ключевой функции):
[2, 3, 5, 7, 1, 4, 6, 8]
0 голосов
/ 22 апреля 2019

Функция helper в sort_priority_0 гарантирует, что сначала элементы в группе сортируются в порядке возрастания, а затем остальные элементы сортируются в порядке возрастания, как вы можете наблюдать ниже.

print(sort_priority_0(numbers,{2, 3, 5, 7}))
#[2, 3, 5, 7, 1, 4, 6, 8]
print(sort_priority_0(numbers,{4, 2, 5, 8}))
#[2, 4, 5, 8, 1, 3, 6, 7]
print(sort_priority_0(numbers,{6, 4, 5, 1}))
#[1, 4, 5, 6, 2, 3, 7, 8]

Возвращение 0,x для элементов в группе гарантирует, что эти элементы помещаются в начало списка во время сортировки, а остальные помещаются в более позднюю половину списка через 1,x, а затем сортируются в в порядке возрастания, поскольку сортировка происходит по 0 и 1, а затем по номерам

...