Roman Pekar объясняет, как вы, , должны сделать это.
Но почему ваша версия работает?
Есть две разные вещи, названные cmp
здесь:
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
Во-первых, что означает cmp=
вы передаете функцию в качестве ключевого слова аргумент с именем cmp
.Как the docs объяснить (в примечании 8):
CMP определяет пользовательскую функцию сравнения двух аргументов (элементов списка), который должен возвращать отрицательное, нулевое или положительное число в зависимости от того, является ли первый аргумент считается меньшим, равным или больше, чем второй аргумент: cmp = lambda x, y: cmp (x.lower(), y.lower()). Значение по умолчанию: None.
Во-вторых, то, что вы передаете в том, что обертка вокруг встроено cmp
функции, которая делает это:
сравнить два объекта х и у и возвращают целое число, в зависимости от результата. Возвращаемое значение отрицательно, если x < y, ноль, если x == y и строго положительное, если x> y.
Итак, вы говорите, что для сравнения двух элементов списка x
и y
, он должен вызвать cmp(len(x), len(y))
. Другими словами, сортируйте их по длине.
Если вы не понимаете, как lambda x, y: cmp(len(x), len(y))
означает, что ...
lambda
выражение это просто способ определения простых функций в середине выражения. Это:
lamdba a, b, c: <some expression>
... определяет ту же самую функцию, как:
def f(a, b, c): return <expression>
... за исключением того, что он не имеет названия, и может быть использовано в середине выражения. Таким образом, ваш lambda
так же, как:
def f(x, y): return cmp(len(x), len(y))
Lambda forms раздел руководства объясняет это ... хотя и не в какой-либо дополнительной глубины, а также раздел справочных материалах Lambdas лишь немного более детально.
Как gnibbler и римской и указывают, используя cmp
вместо key
является устаревшим (и незаконным, в Python 3), и не должно быть сделано, если вы действительно не должны работать с Python 2.3 или выше.
Как gnibbler также указывает, используя lambda
, когда вам не нужен рецепт путаницы.
Итак, ответ Романа - это именно то, что вы должны сделать должно сделать вместо этого.
Sorting HowTo в документах имеет хорошее объяснение всего этого.
Вы имели в виду 'cmp (len (x), len (y))' rather than 'map 'там? – abarnert
@abarnert, это риторический вопрос?:) –
Ну, очевидно, вы имели в виду _something_, кроме 'map' (вы знаете, что делаете, и вы не пытались превратить рабочий код в' TypeError', поэтому я могу предположить, что это была простая опечатка ...) , Но я не был на 100% уверен, что это был 'cmp' вы имели в виду. – abarnert