Как отсортировать с помощью лямбды в Python

179

В Python я пытаюсь отсортировать по дате с помощью лямбды. Я не могу понять свое сообщение об ошибке. Сообщение:

<lambda>() takes exactly 1 argument (2 given)

У меня есть линия

a = sorted(a, lambda x: x.modified, reverse=True)
Никлас Р.
источник
8
добавить аргумент keywoard key = lambda x: x.modified решит проблему
shahjapan

Ответы:

325

использование

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

На Python 2.x sortedфункция принимает аргументы в следующем порядке:

sorted(iterable, cmp=None, key=None, reverse=False)

так что без key=функции, которую вы передаете, будет считаться cmpфункция, которая принимает 2 аргумента.

kennytm
источник
13
У вас есть хороший шанс научиться ценить передачу параметров ключевых слов из этого опыта.
Тони Вейжалайнен
1
Это очень старый, но есть ли у вас идеи, почему код ошибки вводит в заблуждение? Ваш ответ звучит так, как будто Python предоставляет lambdaдругой параметр, поскольку cmpфункция принимает 2?
SuperBiasedMan
@SuperBiasedMan ошибка не вводит в заблуждение. cmpФункция сравнения принимает два аргумента. Если вы не укажете, что передаете a key, из порядка параметров функции предполагается, что вы передаете компаратор. Ваша лямбда принимает один параметр, поэтому не является допустимым компаратором, и именно об этом говорит ошибка.
Jezor
19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Будет напечатано следующее:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Триллионер Санаи
источник
Это не работает для строковых целых чисел. Проверь это! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (key = lambda x: x [1]) print (lst )
Даниэль Куа
Результатом является [('303', '30'), ('343', '34'), ('999', '9')], который не отсортирован по второму элементу в каждом списке.
Даниэль Куа
lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (ключ = лямбда x: x [2]) print (lst)
Даниэль Куа
[(«яблоко», «303», «30»), («ребенок», «343», «34»), («конфеты», «999», «9»)]. Который не отсортирован по базе на 2 элемента тоже!
Даниэль Куа
8

В списках Python есть два встроенных способа сортировки данных:

sort()  A method that modifies the list in-place
sorted()  A built-in function that builds a new sorted list from an iterable

Исходя из ваших требований, вы можете выбрать один из этих двух:

если вы хотите сохранить оригинальный список, вы можете использовать сортированную функцию или, если вам не нужен оригинальный список, вы можете использовать функцию сортировки.

Прежде чем приступить к сортировке или сортировке, нам нужно понять лямбду.

Лямбда - это анонимная функция, а анонимная функция - это функция, которая определена без имени, этот пост, кажется, объясняет это довольно хорошо.

https://www.programiz.com/python-programming/anonymous-function

Лямбда-функции удобны для вызова in-line, потому что они имеют только одно выражение, которое вычисляется и возвращается. У них синтаксис для лямбды такой:

лямбда аргументы: выражение

давайте посмотрим, как использовать отсортированную функцию:

student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
sorted(student_tuples, key=lambda student: student[2]) 

вывод: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Здесь мы видим, что список student_tuples с кортежами отсортирован на основе ключевого параметра при условии, что student [2].

Прити Духан
источник