Прошу прощения за банальный с точки зрения проф. программиста вопрос -
но все же)) Я никак не могу понять, как работает в Питоне сортировка
списков по ключу.
У меня в примерах есть два варианта кода, которые оба работают, но
взрывают мне мозг, потому что я никак не могу понять, как - и почему у
них разное количество входных параметров:
Вариант 1:
def my_key(item):
return (item[1], item[3])
to_sort.sort(key=my_key)
Вариант 2:
sortList.sort(key = lambda (listKey, listValue): listKey)
Объясните, пожалуйста, на пальцах и конкретных примерах списков, как
это работает и как это может быть применено в реальной практике.
Заранее благодарен!
Антон
это
def func((listKey, listValue)):
return listKey
а не
def func(listKey, listValue):
return listKey
как могло бы показаться.
То есть
sortList.sort(key = lambda (listKey, listValue): listKey)
идентично
sortList.sort(key=lambda v: v[0])
2012/2/16 ashdesigner <antony....@gmail.com>:
> --
> Группа: http://groups.google.com/group/better-python-ru
> Отписка: better-python-...@googlegroups.com
Теперь по первому вопросу все встало, наконец, на свои места.
И еще один вопрос - правда, его, наверное, нужно было первым задавать:
а какой вообще смысл в использовании key? Можно привести какой-то
реальный жизненный пример?
On 16 фев, 20:15, Sergey Schetinin <mal...@gmail.com> wrote:
> lambda (listKey, listValue): listKey
>
> это
>
> def func((listKey, listValue)):
> return listKey
>
> а не
>
> def func(listKey, listValue):
> return listKey
>
> как могло бы показаться.
>
> То есть
>
> sortList.sort(key = lambda (listKey, listValue): listKey)
>
> идентично
>
> sortList.sort(key=lambda v: v[0])
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
>>> x = ['b', 'aa']
>>> x.sort()
>>> x
['aa', 'b']
>>> x.sort(key=len)
>>> x
['b', 'aa']
по-умолчанию строки сравниваются лексикографически, а в этом примере я
отсортировал по длине.
В общем это очень полезная фича.
2012/2/16 ashdesigner <antony....@gmail.com>:
sortList.sort(key=lambda v: v[0])
фактически идентично
sortList.sort()
...поскольку сравнивает элементы (в данном случае - индексы значений)
между собой алгоритмом по умолчанию (от меньшего к большему)?
On 16 фев, 21:04, Sergey Schetinin <mal...@gmail.com> wrote:
> Например для того чтобы использовать нестандартное сравнение
>
> >>> x = ['b', 'aa']
> >>> x.sort()
> >>> x
> ['aa', 'b']
> >>> x.sort(key=len)
> >>> x
>
> ['b', 'aa']
>
> по-умолчанию строки сравниваются лексикографически, а в этом примере я
> отсортировал по длине.
>
> В общем это очень полезная фича.
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
В общем-то да. Если считать что в sortList кортежи а не скажем
какие-то мутные обьекты которые поддерживают итерацию но
переопределяют сравнение на какую-то муть. Короче говоря скорее всего
можно key=.. опустить.
2012/2/16 ashdesigner <antony....@gmail.com>:
Получается, что
sortList.sort(key=lambda v: v[0])
никогда не изменит порядок значений в массиве?
(email antony....@gmail.com кажется не подписан на группу, из-за
этого про каждое сообщение админка переспрашивает, попробуйте
подписать именно этот адрес)
2012/2/16 ashdesigner <antony....@gmail.com>:
2012/2/16 Sergey Schetinin <mal...@gmail.com>:
Например, мы имеем такие варианты:
listA = ['a', 'c', 'b']
listB = ['a', 'cc', 'bbb']
listC = [('one', 'two'), ('three', 'four')]
Что будет являться ключом, а что - значением в каждом из случаев при
сортировке?
On 16 фев, 21:18, Sergey Schetinin <mal...@gmail.com> wrote:
> Суть в том, что кортежи (тюплы) сравниваются лексикографически, т.е.
> сначала первые элементы, и только если они равны -- вторые. Т.е.
> результат сравнения пар ключ-значение будет таким же как и у сравнения
> просто ключей (при условии что ключи не равны).
>
> 2012/2/16 Sergey Schetinin <mal...@gmail.com>:
>
>
>
>
>
>
>
> > Почему же не изменит, изменит.
>
> > (email antony.shash...@gmail.com кажется не подписан на группу, из-за
> > этого про каждое сообщение админка переспрашивает, попробуйте
> > подписать именно этот адрес)
>
> > 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
2012/2/16 ashdesigner <antony....@gmail.com>:
a, bbb, ccc
?
On 16 фев, 21:30, Sergey Schetinin <mal...@gmail.com> wrote:
> Эмм.. ну вообще тут путаница. Изначально ключем был назван первый
> аргумент в лямбде в первом вопросе. Это не имеет никакого отношения к
> параметру key у сортировки. В общем только listC подходит для
> сортировки из примера и ключи понятно 'one' и 'three'
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
2012/2/16 ashdesigner <antony....@gmail.com>:
Имеем:
sortList = ['a', 'cc', 'bbb']
def sortByAlphabet(a):
return a[0] # ключ сортировки - первая буква каждой строки
def sortByLength(a):
return len(a) # ключ сортировки - длина каждой строки
sortList.sort(key=sortByAlphabet)
print sortList
# >>> ['a', 'bbb', 'cc']
sortList.sort(key=sortByLength)
print sortList
# >>> ['a', 'cc', 'bbb']
Таким образом, ключ key определяет, какие именно свойства каждого из
перебираемых элементов мы сравниваем. Сортировка по умолчанию идет от
меньшего к большему.
Ура, заработало. Спасибо, Сергей!))
On 16 фев, 21:54, Sergey Schetinin <mal...@gmail.com> wrote:
> просто .sort()
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
Да, всё правильно.
> Ура, заработало. Спасибо, Сергей!))
На здоровье.
On 16 фев, 22:07, Sergey Schetinin <mal...@gmail.com> wrote:
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
Я бы сказал больше, если у проблемы есть два варианта решения --
простой и не требующих пояснений и сложный и требующий множества
документации, то второй окажется более популярным, просто потому что
на него легче наткнуться -- "сети" документации раскинуты шире, есть
всякие комьюнити, тонны блогов, рецептов, учителей, тренингов итд.
(См. например Джанго, Agile и прочий шлак).
Ну и пишушие документацию тоже хотят показать какие они умные, какие
непростые вещи они обьясняют, потому и доки пишутся сложными сами
собой.
2012/2/16 ashdesigner <antony....@gmail.com>:
Я считаю, что программирование как технология должно быть максимально
простым, потому что этим инструментом решаются и без того сложные
задачи. Это как, например, чудовищный синтаксис Objective C, один
взгляд на который приводит в ужас - однако все это безобразие
позиционируется как философия для избранных, ё-маё-куда-деваться))
Если тебе нужно решить сложную задачу, инструменты не должны отнимать
столько же времени на изучение, сколько и сама работа. Они должны быть
максимально простыми и понятными. Выражаясь словами Энштейна, "если ты
не можешь объяснить что-либо просто, значит, ты этого до конца не
понимаешь".
Кстати, за такие же точно "косяки" - усложнение на пустом месте - я не
перевариваю и лженауку философию, но это уже другая тема))
On 16 фев, 22:23, Sergey Schetinin <mal...@gmail.com> wrote:
> Хм. Я не помню как именно задокументирована именно эта фича, и в целом
> текст документации по Питону в основном достаточно хорош, но если
> говорить в общем, то документация действительно часто бывает усложнена
> без нужды.
>
> Я бы сказал больше, если у проблемы есть два варианта решения --
> простой и не требующих пояснений и сложный и требующий множества
> документации, то второй окажется более популярным, просто потому что
> на него легче наткнуться -- "сети" документации раскинуты шире, есть
> всякие комьюнити, тонны блогов, рецептов, учителей, тренингов итд.
> (См. например Джанго, Agile и прочий шлак).
>
> Ну и пишушие документацию тоже хотят показать какие они умные, какие
> непростые вещи они обьясняют, потому и доки пишутся сложными сами
> собой.
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
> ...
>
> продолжение >>
2012/2/16 ashdesigner <antony....@gmail.com>:
On 16 фев, 23:02, Sergey Schetinin <mal...@gmail.com> wrote:
> Это не касается вопроса про .sort(key=..) но поэтому же чаще всего
> читать код лучше чем документацию, потому что приемлемо написанный код
> описывает что же он делает куда более прямо чем документация. Более
> того, код может ответить на вопросы, про которые доки умалчивают итд
> итп. Так не нужно удерживать в голове и реальность и то что про неё
> говорит документация )
>
> 2012/2/16 ashdesigner <antony.shash...@gmail.com>:
> ...
>
> продолжение >>
> ...
>
> продолжение >>
2012/2/16 Vladimir <tv.v...@gmail.com>:
Поскольку на хабре я новичок, то было бы неплохо получить ваши голоса
или даже инвайт)) Ну, если пост захабрят, конечно.
Антон
On 17 фев, 00:50, Sergey Schetinin <mal...@gmail.com> wrote:
> Хм, раз пошла такая жара, дайте инвай чтоли? )
>
> 2012/2/16 Vladimir <tv.vl...@gmail.com>:
>
>
>
>
>
>
>
> > в песочницу? покажешь, поставлю плюс
>
> > 16 февраля 2012 г. 22:10 пользователь ashdesigner
> > <antony.shash...@gmail.com> написал:
> ...
>
> продолжение >>
Мне дали приглашение на хабр - и запостили мою заметку:
http://habrahabr.ru/blogs/python/138535/
Комментируйте, если есть желание)) И, конечно же, большое спасибо
Сергею за помощь!
> ...
>
> продолжение >>
> ...
>
> продолжение >>
2012/2/20 Vladimir <tv.v...@gmail.com>: