Як сортувати з лямбда в Python


179

У Python я намагаюся сортувати за датою лямбда. Я не можу зрозуміти своє повідомлення про помилку. Повідомлення:

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

Лінія у мене така

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

8
додати аргумент keywoard key 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 аргументи.


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 = лямбда x: x [1]) print (lst )
Даніель Куа

Результатом є [('303', '30'), ('343', '34'), ('999', '9')], який не відсортований за другим елементом у кожному списку.
Даніель Куа

lst = [('цукерки', '999', '9'), ('яблуко', '303', '30'), ('дитина', '343', '34')] lst.sort (ключ = lambda 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

Функції лямбда приємні для виклику в мережі, оскільки вони мають лише один вираз, який оцінюється та повертається. Синтаксис лямбда - це:

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

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

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, що мають кортежі, відсортований на основі ключового параметра за умови, що це студент [2].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.