Про lambda в python

Jan 21, 2010 21:14

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

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

Правда, у человека который предложил самое быстрое решение с getitem-ом испольузется кроме sorted еще и reversed, в то время как мне lambda позволяет просто поменять знак у ключей.

Господа питонисты, объясните откуда такая любовь к getitem-у берется.

компьютерное

Previous post Next post
Up