"ключ: значение", отсортированный порядке убывания значений.
Поскольку питон я знаю плохо, попробовал порешать.
Поскольку питон, опять таки знаю плохо, сначала придумал ответ на 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, которое на мой взгляд, куда проще и естественней читается, оказалось вторым по скорости после решения
Правда, у человека который предложил самое быстрое решение с getitem-ом испольузется кроме sorted еще и reversed, в то время как мне lambda позволяет просто поменять знак у ключей.
Господа питонисты, объясните откуда такая любовь к getitem-у берется.
January 21 2010, 18:31:31 UTC 2 years ago
"The new functions run faster and are considered by some to improve readability."
January 21 2010, 18:42:48 UTC 2 years ago
А насчет run faster - тут облом. Поскольку тут лямбда делает две вещи сразу, реализация, которая использует две функции из
PEP 290 - getitem и reversed оказывается медленнее, чем реализация, использущая ОДНУ лямбду. Видимо
lamda x: -x[1]- это uncommon use of lamda.Странно что никому не пришло в голову использовать
sorted(d.items,key=getitem(1),reverse=Tr ue)И что никто не пытался использовать оператор форматирования по шаблону для конструирования итоговой строки.
Побенчмаркать эти варианты что-ли.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
January 21 2010, 18:42:10 UTC 2 years ago
1. Давно и упорно ходят слухи (а может уже и не слухи, не следил за третьим питоном), что Гвидо таки выпилит лямбды нафиг.
2. На мой персональный вкус питоновский код с лямбдами читается хуже. Очень уж они выпирают из общего питоновского стиля. Против лямбд ничего не имею, но вот именно в питоне стараюсь обходится без них.
Общественная причина в том, что вполне конкретные студенты-стажёры, с которыми приходилось работать, обычно догадываются куда надо посмотреть на тему operator.itemgetter, а вот лямбда вгоняет их в ступор. Причину этого странного выверта ещё предстоит изучить психологам.
January 21 2010, 18:44:11 UTC 2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
January 21 2010, 18:48:53 UTC 2 years ago
2 years ago
2 years ago
January 21 2010, 19:07:02 UTC 2 years ago
January 21 2010, 19:17:02 UTC 2 years ago
["%s: %s" % (key, value) for key, value in sorted(sdict.items(), key=lambda x: x[1], reverse=True)]
January 21 2010, 19:19:19 UTC 2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
January 21 2010, 20:40:01 UTC 2 years ago
2 years ago
2 years ago
January 21 2010, 19:55:06 UTC 2 years ago
operator.getitem != operator.itemgetter
January 21 2010, 20:00:26 UTC 2 years ago
Этот пример, например, можно решить таким способом.
January 21 2010, 21:22:49 UTC 2 years ago
Ненавижу...
Ненавижу именованные сущности, используемые не более, чем полтора раза.Ненавижу, когда эран заполнен не алгоритмом, а флудом, дабы ублажить тупой компилятор и ограниченный язык.
Ненавижу С++/java за класс или обобщенный класс на каждый чих.
И люблю лямбы за их компактность, локальность, уместность и скромность.
2 years ago
2 years ago
2 years ago
2 years ago
January 21 2010, 21:30:08 UTC 2 years ago
January 21 2010, 22:14:50 UTC 2 years ago
Жалко, что так мало людей понимают вред от наличия излишних имён в программе.
Вот вроде бы про метки давно Дийкстра написал, что от них - вред. Дийкстра был в авторитете, не было тьмы хомяков, которые кричали бы "метки - круть! я люблю свободу и желаю ставить метки!" и таким образом правильное мнение Дийкстры распространилось.
Сегодня нет такого Дийкстры, который мог бы объяснить хомякам, что любой именованный объект в программе - это не что иное, как та же метка.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
January 21 2010, 21:17:46 UTC 2 years ago
(В питонной постановке задачи читабельность важнее скорости)
January 21 2010, 22:49:35 UTC 2 years ago
2 years ago
2 years ago
January 22 2010, 01:47:48 UTC 2 years ago
Сам Гвидо высказывался не раз за убрать ее нафиг. По причине "ухудшает читаемость кода". Ссылку не приведу, но это конкретно его слова.
January 22 2010, 04:14:56 UTC 2 years ago
То есть тот метод, который удобнее разработчику и лучше (привычнее) читаем - будет являться более правильным.
Бизнес-философия дополняет это тезисом "скорость и простота разработки важнее быстродействия решения".
То есть, докупка железа обходится на порядки дешевле бесконечных бенчмарков и профилирования.
Мне пайтон нравится за то, что он очень нагляден и пригоден для быстрого написания именно алгоритма целого функционала. Если же необходимо что-то "форсировать", то к решению проблемы подключаются явисты или сишники.
January 22 2010, 06:56:15 UTC 2 years ago
Почему столько народу и в том, и в этом треде убеждены в обратном - я не понимаю.
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
January 22 2010, 08:44:51 UTC 2 years ago
Вариант с лямбдой мне тоже кажется более приятным - используется более универсальная кросс-языковая концепция, чем языко-специфичный import из operator, не дающий глобального знания. Студенту, знакомому с лямбдами, в этом случае не понадобится лезть в документацию.
January 22 2010, 20:56:04 UTC 2 years ago
+100500
January 25 2010, 04:37:28 UTC 2 years ago
January 25 2010, 18:23:00 UTC 2 years ago
В C++ GC нет и не будет.
И вообще, хватит издеваться над трупом.
January 22 2010, 09:03:00 UTC 2 years ago
хмм
Я поковырявшись придумал вот такое:["{0} {1}".format(x, y) for x, y in sorted(lst.items(), cmp = lambda x, y: -cmp(x[1], y[1]))]
Вроде бы нагляднее некуда: генератор + сортировка.
Потом поглядел на ваше - очень похоже.
January 22 2010, 11:10:53 UTC 2 years ago
Re: хмм
-cmp(x[1], y[1]) не то же самое, что cmp(y[1], x[1])?2 years ago