Синтаксис за сортировкой(ключ=лямбда: …)



Я не совсем понимаю синтаксис за :



key=lambda variable: variable[0]


не lambda произвольные? Почему это variable указано дважды в том, что выглядит как dict?

682   6  

6 ответов:

key - это функция, которая будет вызвана для преобразования элементов коллекции перед их сравнением. Параметр передается в key должно быть что-то вызываемое.

использование lambda создает анонимную функцию (которая может быть вызвана). В случае sorted вызываемый принимает только один параметр. Питона lambda - Это довольно просто. Он может сделать и вернуть только одну вещь на самом деле.

синтаксис lambda слово lambda затем список имен параметров, то один блок кода. Список параметров и блок кода обозначаются двоеточием. Это похоже на другие конструкции в python, а также такие как while,for,if и так далее. Все они являются операторами, которые обычно имеют блок кода. Лямбда-это просто еще один экземпляр оператора с блоком кода.

мы можем сравнить использование лямбда с использованием def для создания функции.

adder_lambda = lambda parameter1,parameter2: parameter1+parameter2
def adder_regular(parameter1, parameter2): return parameter1+parameter2

лямбда просто дает нам способ сделать это без присвоения имени. Что делает его отличным для использования в качестве параметра функции.

variable используется здесь дважды, потому что в левой части двоеточия это имя параметра, а в правой части он используется в блоке кода для вычисления чего-то.

Я думаю, что все ответы здесь охватывают суть того, что делает лямбда-функция в контексте sorted() довольно хорошо, однако я все еще чувствую, что описание, которое приводит к интуитивному пониманию, отсутствует, поэтому вот мои два цента.

для полноты изложения я скажу очевидное: sorted() возвращает список отсортированных элементов, и если мы хотим отсортировать определенным образом или если мы хотим отсортировать сложный список элементов (например, вложенные списки или список кортежи) мы можем вызвать ключевой аргумент.

  1. использование lamba в конечном счете означает, что вам не нужно писать (определять) всю функцию, например, ту, которую sblom предоставил в качестве примера. Лямбда-функции создаются, используются и немедленно уничтожаются - так что они не испортят ваш код с большим количеством код, который будет использоваться только один раз. Это, как я понимаю, является основной полезностью лямбда-функции, и ее приложения для таких ролей являются широкими. Его синтаксис является чисто условным, что по сути является природой программного синтаксиса в целом. Изучите синтаксис и покончите с этим.

лямбда-синтаксис выглядит следующим образом:

лямда -input_variable (s):вкусные лайнер

например

In [1]: f00 = lambda x: x/2

In [2]: f00(10)
Out[2]: 5.0

In [3]: (lambda x: x/2)(10)
Out[3]: 5.0
  1. идея ключевого аргумента заключается в том, что он принимает набор инструкций, которые по существу указывают " sorted ()", в каких элементах списка он должен использовать для сортировки. Когда он говорит " key=", это действительно означает: когда я повторяю список по одному элементу за раз (т. е. для e в списке), я собираюсь передать текущий элемент функции, которую я предоставляю в ключевом аргументе, и использовать его для создания преобразованного списка, который сообщит мне о порядке окончательного отсортированного списка.

зацени:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=WhatToSortBy)

базовый пример:

sorted(mylist)

[2, 3, 3, 4, 6, 8, 23] # все цифры идут по порядку от малого к большому.

Пример 1:

mylist = [3,6,3,2,4,8,23]
sorted(mylist, key=lambda x: x%2==0)

[3, 3, 23, 6, 2, 4, 8] # это отсортированный результат интуитивно понятно вам?

обратите внимание, что моя лямбда-функция сказала отсортировать, чтобы проверить, был ли (e) четным или странно перед сортировкой.

НО ПОДОЖДИТЕ! Вы можете (или, возможно, должны) задаться вопросом о двух вещах: Во-первых, почему мои шансы идут до моих эвенов (поскольку мое ключевое значение, похоже, говорит моей сортированной функции о приоритизации эвенов с помощью оператора mod в x%2==0) и во-вторых, почему мои эвены не в порядке? 2 приходит до 6 Правильно? Анализируя этот результат, мы узнаем что-то более глубокое о том, как работает аргумент sorted() 'key', особенно в сочетании с анонимной лямбда-функцией.

во-первых, вы заметите, что в то время как шансы приходят до эвенов, сами эвены не сортируются. Почему это так?? давайте читать документы:

Основные Функции начиная с Python 2.4, оба списка.sort () и sorted() добавили ключевой параметр для указания функции, которая будет вызываться каждый элемент списка перед выполнением сравнения.

мы должны сделать немного читать Между строк, но что это говорит нам о том, что функция сортировки вызывается только один раз, и если мы указываем ключевой аргумент, то мы сортируем по значению, на которое указывает нам ключевая функция.

что делает пример с использованием возврата по модулю? Логическое значение: True=1, False=0. Итак, как сортировка справляется с этим ключом? Он в основном преобразует исходный список в последовательность 1s и 0s.

[3,6,3,2,4,8,23] становится [0,1,0,1,1,1,0]

теперь мы кое-что получаем. Что вы получаете, когда сортируете преобразованный список?

[0,0,0,1,1,1,1]

хорошо, теперь мы знаем, почему шансы приходят до эвенов. Но следующий вопрос: Почему 6 все еще идут перед 2 в моем окончательном списке? Ну, это легко - это потому, что сортировка происходит только один раз! Последний вопрос заключается в следующем: как я думаю концептуально о том, как порядок моих булевых значений преобразуется обратно в исходные значения, когда я распечатываю окончательный сортированный список?

Sorted ()-это встроенный метод, который (забавный факт) использует гибридный алгоритм сортировки под названием Timsort что сочетает в себе аспекты сортировки слиянием и сортировки вставками. Мне кажется ясным, что когда вы его называете, есть механик, который держит эти значения в памяти и связывает их с их логическим идентификатором (маской), определяемым (...!) лямбда-функция. Порядок определяется их логическим тождеством, вычисленным из лямбда-функции, но имейте в виду, что эти подсписки (единицы и нули) сами по себе не сортируются по их исходным значениям. Таким образом, окончательный список, организованный по коэффициентам и Четам, не сортируется по подлистам (четности в этом случае не упорядочены). Дело в том, что коэффициенты упорядочены, потому что они уже были в порядке совпадения в исходном списке. Вывод из всего этого заключается в том, что когда лямбда выполняет это преобразование, исходный порядок подсписков сохраняется.

так как это все связано с оригинальный вопрос, и что еще более важно, наша интуиция о том, как мы должны реализовать sorted() с его ключевым аргументом и лямбда?

эта лямбда-функция может рассматриваться как указатель, указывающий на значения, которые нам нужно отсортировать,будь то указатель,отображающий значение на его логическое преобразование лямбда-функцией, или если его конкретный элемент во вложенном списке, кортеже, dict и т. д. снова определяется лямбда-функцией.

давайте попробуем предсказать, что произойдет, когда я бегу следующий код.

mylist = [(3, 5, 8), (6, 2, 8), ( 2, 9, 4), (6, 8, 5)]
sorted(mylist, key=lambda x: x[1])

мои сортированные методы, очевидно, говорит:"Пожалуйста, отсортируйте этот список". Ключевой аргумент делает это немного более конкретным, говоря, что для каждого элемента (x) в mylist, return index 1 этого элемента, затем отсортировать все элементы исходного списка 'mylist' по порядку сортировки списка, вычисленного лямбда-функцией. Поскольку у нас есть список кортежей, мы можем вернуть индексированный элемент кортежа. Так мы получаем:

[(6, 2, 8), (3, 5, 8), (6, 8, 5), (2, 9, 4)]

запустите этот код, и вы обнаружите, что это порядок. Попробуйте индексировать список целых чисел, и вы обнаружите, что код ломается.

Это было длинное объяснение, но я надеюсь, что это поможет "сортировать" вашу интуицию по использованию лямбда-функций в качестве ключевого аргумента в sorted() и за его пределами.

lambda - Это ключевое слово Python, которое используется для создать анонимные функции.

>>> (lambda x: x+2)(3)
5

The variable слева от : - это имя параметра. Использование variable справа использует параметр.

означает почти то же, что:

def some_method(variable):
  return variable[0]

lambda является анонимной функцией, а не произвольной функцией. Принимаемый параметр будет переменной, с которой вы работаете, и столбцом, в котором вы его сортируете.

Так как использование лямбды было задано в контексте sorted(), взгляните на это также https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

Comments

    Ничего не найдено.