2013-09-16 2 views
1
a=['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(cmp=lambda x,y:cmp(len(x),len(y))) 
print a 

Пожалели за мое невежество, я не понимаю, как это лямбда-функция работает, все, что я знаю о импе, чтобы дать +1/1/0, чтобы показать результат сравнения, len дает длину строки Как функция лямбда взяла аргументы? в парах? взяв 1-й, 2-й, 3-й, 4-й? и что здесь делает? Большое вам спасибо за помощь!Аранжировка количества строк с помощью функции лямбды Питона

ответ

2

Возможно, это легче понять, используя обычную функцию

def cmp_function(x, y): 
    return cmp(len(x), len(y)) 

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(cmp=cmp_function) 
print a 

лямбда-функция действительно не лучше, чем обычная функция здесь. Труднее документировать и тестировать.

Кроме того: cmp устарел на Python2, поэтому вместо этого вы должны использовать ключевую функцию.

def key_function(x): 
    return len(x) 

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(key=key_function) 
print a 

Как и в @ ответ Романа, это key_function просто оберткой len, так что вы можете написать

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(key=len) 
print a 

В качестве упражнения, вы можете добавить оператор печати в cmp_function и key_function - посмотреть, как вызывается много раз каждый. Сравните это с количеством единиц в a

+0

Вы имели в виду 'cmp (len (x), len (y))' rather than 'map 'там? – abarnert

+0

@abarnert, это риторический вопрос?:) –

+0

Ну, очевидно, вы имели в виду _something_, кроме 'map' (вы знаете, что делаете, и вы не пытались превратить рабочий код в' TypeError', поэтому я могу предположить, что это была простая опечатка ...) , Но я не был на 100% уверен, что это был 'cmp' вы имели в виду. – abarnert

3

Почему бы не использовать key?

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(key=len) 

Если вы хотите использовать старый стиль сортировки с cmp, вы бы определить функцию CMP like this:

Эта функция должна принимать два аргумента сравнимые, а затем возвращать отрицательное значение для менее чем, возвращает нулевое значение, если они равны, или возвращает положительное значение больше чем

так что в вашем случае это может быть что-то вроде:

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese'] 
a.sort(cmp=lambda x, y: len(x) - len(y)) 

Эта функция используется для сравнения двух элементов в сравнении на основе сорта (Timsort, если я не ошибаюсь)

+0

@DSM спасибо, я уже редактирую свой ответ –

+0

Это объясняет, почему его код не работает и как он может его исправить. Но его код не работает. Поэтому вы объясняете неправильную вещь. Все еще отличное объяснение того, как это сделать лучше, но ... – abarnert

+0

@abarnert спасибо, пропустили эту точку, +1 для вас для объяснения –

1

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 в документах имеет хорошее объяснение всего этого.