Sort с лямбда функцией
В этой статье вы узнаете об анонимной функции, также известной как лямбда-функции. Вы узнаете, что это такое, их синтаксис и как их использовать (с примерами).
Что такое лямбда-функция в Python?
В Python анонимная функция ‒ это функция, которая определяется без имени. В то время как обычные функции определяются с помощью ключевого слова def, анонимные определяются с помощью ключевого слова lambda. Следовательно, анонимные функции также называются лямбда-функциями.
Лямбда-функция имеет следующий синтаксис.
lambda arguments: expression
Лямбда-функции могут иметь любое количество аргументов, но только одно выражение. Выражение оценивается и возвращается. Лямбда-функции можно использовать везде, где требуются функциональные объекты.
Пример
Вот пример лямбда-функции, которая удваивает входное значение:
В приведенной выше программе лямбда x: x * 2 ‒ это лямбда-функция. Здесь x ‒ аргумент, а x * 2 ‒ выражение, которое вычисляется и возвращается.
У этой функции нет названия. Он возвращает объект функции, который назначен идентификатору double. Теперь мы можем вызывать это как обычную функцию.
Почти то же самое, что:
Использование
Мы используем лямбда-функции, когда нам требуется безымянная функция на короткий период времени.
В Python мы обычно используем его в качестве аргумента функции высшего порядка (функции, которая принимает другие функции в качестве аргументов). Лямбда-функции используются вместе со встроенными функциями, такими как filter(), map() и т.д.
Пример использования с filter()
Функция filter() в Python принимает в качестве аргументов функцию и список.
Метод вызывается со всеми элементами в списке, и возвращается новый список, содержащий элементы, для которых функция оценивается как True.
Вот пример использования функции filter() для фильтрации только четных чисел из списка.
Пример использования с map()
Функция map() принимает функцию и список.
Метод вызывается со всеми элементами в списке, и возвращается новый список, содержащий элементы, возвращаемые этой функцией для каждого элемента.
Вот пример использования функции map() для удвоения всех элементов в списке.
Я просматриваю учебное введение для Python и застрял на понимании фрагмента кода. Это из раздела 4.7.5 учебника.
Этот кусок кода возвращает
Таким образом, в первой строке он определяет пары со списком различных кортежей. Я понимаю. Вторая линия-это то место, где я полностью сбит с толку, и я довольно много возился с ней, пытаясь понять, что происходит.
Я обнаружил, что sort() применяет встроенную функцию к парам переменных и, по-видимому, сортирует их в соответствии с инструкциями, которые я ему даю.
Функция sort() требует ключа, а ключ должен быть определен с помощью функции, следовательно, использование lambda. Я думаю, что все это правильно, но я могу быть далеко отсюда.
Lambda определяет новый параметр "pair" в левой части двоеточия, а в правой-вычисление для определения возвращаемого значения функции lambda.
Вот тут-то меня и сбивают с толку. Что делает "pair[1]"? Каково его влияние на "pair" в левой части толстой кишки?
Какую ценность он возвращает? Кажется, я не могу заставить его возвращать какое-либо значение вне кодирования его просто так.
Я предполагаю, что он каким-то образом указывает на определенный кортеж и сортирует его на основе изменения его положения, но я не уверен в логике этого.
Кто-нибудь может мне это объяснить? Спасибо.
3 ответа
Мне нужно отсортировать список кортежей в Python по определенному элементу кортежа, скажем, это второй элемент в данном случае. Я пытался sorted(tupList, key = lambda tup: tup[1]) Я тоже пробовал sorted(tupList, key = itemgetter(1)) '''i imported itemgetter, attrgetter, methodcaller from.
После нескольких проблем, решенных в предыдущих постах, у меня теперь есть еще одна ошибка. Сортировка по алфавиту (если сортировка == 1) работает нормально, но сортировка по наивысшему баллу (если сортировка == 2) и среднему баллу (если сортировка == 3) печатает только файл csv, а не сортирует.
Иногда , начиная работать с lambda , проще написать функцию явно. Ваша функция lambda эквивалентна:
Если мы хотим быть более подробными, мы можем распаковать пару, чтобы сделать ее еще более очевидной:
Поскольку list.sort упорядочивает элементы на основе возвращаемого значения функции key (если она присутствует), теперь мы видим, что она сортирует кортежи по их строковому значению . Поскольку строки сортируются лексикографически, "four" стоит перед "one" (подумайте об алфавитном порядке).
A lambda -это упрощенная функция, использующая только выражение.
Любой lambda может быть записан как функция, добавив return перед выражением, так что lambda pair: pair[1] становится:
Таким образом, lambda в вызове list.sort() здесь возвращает второй элемент каждой последовательности, которая передается (индексы Python начинаются с 0 ).
Вы можете сделать это видимым, назначив lambda переменной, скажем, key :
Метод list.sort() использует выходные данные этих вызовов (один раз для каждого элемента в списке) для сортировки элементов. Таким образом, для 4 элементов функция возвращает 'one' , 'two' , 'three' и 'four' , и 4 кортежа затем сортируются исключительно по лексикографическому (алфавитному) порядку этих 4 строк. Этот порядок будет 'four' , 'one' , 'three' , 'two' , что вы видите в окончательном отсортированном списке.
Эта форма sorting-by-alternative-key обычно называется преобразованием Шварца , в честь Рэндала Л. Шварца, который популяризировал эту технику в Perl.
ваша функция lambda принимает кортеж в качестве входных данных и возвращает элемент с индексом 1 (таким образом, второй элемент, начиная с первого, будет иметь 0 для индекса). таким образом, сортировка будет учитывать только второй элемент каждого кортежа (английское слово). Вот почему ваши выходные данные сортируются по алфавиту во втором элементе 'four'>'one'>'three'>'two'
Похожие вопросы:
У меня есть список кортежей student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ] Я пробовал разные способы сортировки, используя функции itemgetter и lambda. Сортировка по.
Возможный Дубликат : Python: сортировка словаря по значению d = Если я использую sorted() с lambda: s = sorted(d.items(), key=lambda(k,v):(v,k)) Я получаю список кортежей (ключ.
Мне нужно отсортировать список кортежей в Python по определенному элементу кортежа, скажем, это второй элемент в данном случае. Я пытался sorted(tupList, key = lambda tup: tup[1]) Я тоже пробовал.
После нескольких проблем, решенных в предыдущих постах, у меня теперь есть еще одна ошибка. Сортировка по алфавиту (если сортировка == 1) работает нормально, но сортировка по наивысшему баллу (если.
У меня есть список кортежей в моем коде Blender python scores=[(1489,Sean), (2850,Bob), (276,Crap Player), (78495, Great Player), (8473, Damian), (4860, Andy), (0, Stephen)] Я пытаюсь отсортировать.
То, что я пытаюсь сделать, это отсортировать список кортежей, что первая ячейка в кортеже может быть много вложенных кортежей, но вторая ячейка всегда является значением int, Мой код: t = [('d',2).
Я думаю о разных способах взять сумму квадратов в python. Я обнаружил, что следующие работы используют понимание списка: def sum_of_squares(n): return sum(x ** 2 for x in range(1, n)) Но при.
Я использую python для сопоставления изображений. Векторы признаков для эталонных изображений хранятся в базе данных mysql. Для каждого нового изображения я генерирую вектор признаков, нахожу.
Учитывая список кортежей, [(x, y, z), . (x_n, y_n,z_n)], x, y-неотрицательное число, а z-либо 0, либо 1, я хочу отсортировать список на основе следующих трех критериев- если x_i != x_j.
Метод Python List sort, предназначен для сортировки списка в определенном порядке.
Синтаксис и параметры метода sort()
Синтаксис метода sort() :
В качестве альтернативы методу sort() , так же можно использовать встроенный метод в python метод sorted() , который в принципе выполняет ту же функцию.
Между этими двумя методами есть небольшое различие. Метод sort() отсортирует список напрямую, и не возвращает никаких значений, а метод sorted() не изменяет оригинальный список, а возвращает отсортированный список.
Параметры метода sort()
Метод sort() изначально не требует никаких параметров, но в то же время, у данного метода есть два дополнительных параметра:
- reverse — Если значение True, отсортированный список идет в обратном порядке, либо сортировка выполнена в порядке убывания.
- key — Данный параметр можно указать в качестве ключа для сравнения сортировки
Пример 1. Сортировка списка
Сортировка списка в порядке убывания
Как мы уже говорили, у метода sort() есть необязательный аргумент reverse . Если мы установим метода reverse=True , то список будет отсортирован в порядке убывания.
Так же можно воспользоваться альтернативным решением, и использовать встроенную функцию в Python, sorted() .
Пример 2. Сортировка в порядке убывания
Пользовательская сортировка списка с помощью ключа
Представим себе ситуацию, где нам необходимо реализовать свой собственный метод сортировки. В таком случае, метод sort() принимает в качестве необязательного параметра аргумент key .
Альтернативный вариант с использованием метода sorted() .
В данном случае, len() — это встроенная функция Python, которая применяется для подсчета длины каждого элемента. После того, как у нас есть длина каждого элемента, мы можем отсортировать этот список от наименьшего до наибольшего, или наоборот.
Пример 3. Сортировка списка с помощью ключа
Как видите ключ прекрасно выполнил свою задачу, мы отсортировали данный список по второму элементу. Для более ясного понимания, как все это дело работает, предлагаю рассмотреть еще один пример, чуть по сложнее. Представим себе, что у нас есть список сотрудников компании, каждый элемент данного списка будет являться словарем. Вначале я приведу весь листинг кода вместе с результатом, а затем мы разберем, как это работает.
- В первом случае, наша функция возвращает нам имена сотрудников. Так как имя у нас является строкой, то соответственно Python сортирует его в алфавитном порядке.
- Второй случай возвращает нам возраст, тип данных которого int() , и сортируется в порядке возрастания
- В третьем случае, функция возвращает зарплату, и ее тип данных тоже int() , в данном случае используется дополнительный параметр reverse со значением True , и сортируется в порядке убывания.
Вышеприведенный код, можно сократить используя lambda функции, такое решение позволит нам свести функцию в одну строку. Соответственно, вышеприведенный код можно переписать следующим образом:
не lambda произвольные? Почему это variable указано дважды в том, что выглядит как dict ?
key - это функция, которая будет вызвана для преобразования элементов коллекции перед их сравнением. Параметр передается в key должно быть что-то вызываемое.
использование lambda создает анонимную функцию (которая может быть вызвана). В случае sorted вызываемый принимает только один параметр. Питона lambda - Это довольно просто. Он может сделать и вернуть только одну вещь на самом деле.
синтаксис lambda слово lambda затем список имен параметров, то один блок кода. Список параметров и блок кода обозначаются двоеточием. Это похоже на другие конструкции в python, а также такие как while , for , if и так далее. Все они являются операторами, которые обычно имеют блок кода. Лямбда-это просто еще один экземпляр оператора с блоком кода.
мы можем сравнить использование лямбда с использованием def для создания функции.
лямбда просто дает нам способ сделать это без присвоения имени. Что делает его отличным для использования в качестве параметра функции.
variable используется здесь дважды, потому что в левой части двоеточия это имя параметра, а в правой части он используется в блоке кода для вычисления чего-то.
- использование lamba в конечном счете означает, что вам не нужно писать (определять) всю функцию, например, ту, которую sblom предоставил в качестве примера. Лямбда-функции создаются, используются и немедленно уничтожаются - так что они не испортят ваш код с большим количеством код, который будет использоваться только один раз. Это, как я понимаю, является основной полезностью лямбда-функции, и ее приложения для таких ролей являются широкими. Его синтаксис является чисто условным, что по сути является природой программного синтаксиса в целом. Изучите синтаксис и покончите с этим.
Основные Функции начиная с Python 2.4, оба списка.sort () и sorted() добавили ключевой параметр для указания функции, которая будет вызываться каждый элемент списка перед выполнением сравнения.
мы должны сделать немного читать Между строк, но что это говорит нам о том, что функция сортировки вызывается только один раз, и если мы указываем ключевой аргумент, то мы сортируем по значению, на которое указывает нам ключевая функция.
что делает пример с использованием возврата по модулю? Логическое значение: True=1, False=0. Итак, как сортировка справляется с этим ключом? Он в основном преобразует исходный список в последовательность 1s и 0s.
теперь мы кое-что получаем. Что вы получаете, когда сортируете преобразованный список?
хорошо, теперь мы знаем, почему шансы приходят до эвенов. Но следующий вопрос: Почему 6 все еще идут перед 2 в моем окончательном списке? Ну, это легко - это потому, что сортировка происходит только один раз! Последний вопрос заключается в следующем: как я думаю концептуально о том, как порядок моих булевых значений преобразуется обратно в исходные значения, когда я распечатываю окончательный сортированный список?
Sorted ()-это встроенный метод, который (забавный факт) использует гибридный алгоритм сортировки под названием Timsort что сочетает в себе аспекты сортировки слиянием и сортировки вставками. Мне кажется ясным, что когда вы его называете, есть механик, который держит эти значения в памяти и связывает их с их логическим идентификатором (маской), определяемым (. ) лямбда-функция. Порядок определяется их логическим тождеством, вычисленным из лямбда-функции, но имейте в виду, что эти подсписки (единицы и нули) сами по себе не сортируются по их исходным значениям. Таким образом, окончательный список, организованный по коэффициентам и Четам, не сортируется по подлистам (четности в этом случае не упорядочены). Дело в том, что коэффициенты упорядочены, потому что они уже были в порядке совпадения в исходном списке. Вывод из всего этого заключается в том, что когда лямбда выполняет это преобразование, исходный порядок подсписков сохраняется.
так как это все связано с оригинальный вопрос, и что еще более важно, наша интуиция о том, как мы должны реализовать sorted() с его ключевым аргументом и лямбда?
эта лямбда-функция может рассматриваться как указатель, указывающий на значения, которые нам нужно отсортировать,будь то указатель,отображающий значение на его логическое преобразование лямбда-функцией, или если его конкретный элемент во вложенном списке, кортеже, dict и т. д. снова определяется лямбда-функцией.
давайте попробуем предсказать, что произойдет, когда я бегу следующий код.
мои сортированные методы, очевидно, говорит:"Пожалуйста, отсортируйте этот список". Ключевой аргумент делает это немного более конкретным, говоря, что для каждого элемента (x) в mylist, return index 1 этого элемента, затем отсортировать все элементы исходного списка 'mylist' по порядку сортировки списка, вычисленного лямбда-функцией. Поскольку у нас есть список кортежей, мы можем вернуть индексированный элемент кортежа. Так мы получаем:
запустите этот код, и вы обнаружите, что это порядок. Попробуйте индексировать список целых чисел, и вы обнаружите, что код ломается.
Это было длинное объяснение, но я надеюсь, что это поможет "сортировать" вашу интуицию по использованию лямбда-функций в качестве ключевого аргумента в sorted() и за его пределами.
Читайте также: