Про lambda в python
Jan. 21st, 2010 09:14 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вот в
ru_python поставили задачу - имеется словарь. Выдать список строк вида
"ключ: значение", отсортированный порядке убывания значений.
Поскольку питон я знаю плохо, попробовал порешать.
Поскольку питон, опять таки знаю плохо, сначала придумал ответ на perl
Потом стал переводить на python. Обнаружил что в питоне в данном конкретном случае есть более удобный функционал у сортировки - подменять не функцию сравнения, а функцию извлечения ключа из элемента списка
Получилось:
Еще немного почитав про словари, я узнал что в питоне у словаря есть в данном случае метод items, который позволяет обойтись без знания глобального имени словаря:
НА сем и успокоился, и стал читать решения других читателей сообщества. Обнаружил что все как один испольуют вместо lambda импорт из модуля operator
Кто-то там собрался и провел бенчмарки, так мое решение с lambda, которое на мой взгляд, куда проще и естественней читается, оказалось вторым по скорости после решения
avysk, которое вообще-то решением не является, а явялется только демонстрацией одного из шагов в решении (не тот порядок сортировки, нет преобразования tuple в строку через заданный разделитель)
Правда, у человека который предложил самое быстрое решение с getitem-ом испольузется кроме sorted еще и reversed, в то время как мне lambda позволяет просто поменять знак у ключей.
Господа питонисты, объясните откуда такая любовь к getitem-у берется.
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-community.gif)
"ключ: значение", отсортированный порядке убывания значений.
Поскольку питон я знаю плохо, попробовал порешать.
Поскольку питон, опять таки знаю плохо, сначала придумал ответ на perl
map("$_: $x{$_}",sort($x{b}<=>$x{a},keys %hash));
Потом стал переводить на python. Обнаружил что в питоне в данном конкретном случае есть более удобный функционал у сортировки - подменять не функцию сравнения, а функцию извлечения ключа из элемента списка
Получилось:
[ x+" "+str(d[x]) for x in sorted( d.keys(), key=lambda(x): -d[x]]
Еще немного почитав про словари, я узнал что в питоне у словаря есть в данном случае метод items, который позволяет обойтись без знания глобального имени словаря:
[ x[0]+" "+str(x[1]) for x in sorted(d.items(), key=lambda(x): -x[1]]
НА сем и успокоился, и стал читать решения других читателей сообщества. Обнаружил что все как один испольуют вместо lambda импорт из модуля operator
from operator import getitem; ... key=getitem(1)
getitem
описан как функция с двумя элементами. То есть тут еще и currying используется. Почему это для всех питонистов, соизволивших ответить на этот вопрос, сочетание импорта модуля, который фактически лезет куда-то в потроха интерпретатора, вроде перлового Opcode с currying кажется куда более естественным, чем старая добрая lambda?Кто-то там собрался и провел бенчмарки, так мое решение с lambda, которое на мой взгляд, куда проще и естественней читается, оказалось вторым по скорости после решения
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Правда, у человека который предложил самое быстрое решение с getitem-ом испольузется кроме sorted еще и reversed, в то время как мне lambda позволяет просто поменять знак у ключей.
Господа питонисты, объясните откуда такая любовь к getitem-у берется.