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() возвращает список отсортированных элементов, и если мы хотим отсортировать определенным образом или если мы хотим отсортировать сложный список элементов (например, вложенные списки или список кортежи) мы можем вызвать ключевой аргумент.
- использование 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
- идея ключевого аргумента заключается в том, что он принимает набор инструкций, которые по существу указывают " 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