Como classificar com lambda em Python

178

No Python, estou tentando classificar por data com o lambda. Não consigo entender minha mensagem de erro. A mensagem é:

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

A linha que tenho é

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
fonte
8
add key argumento keywoard = lambda x: x.modified vai resolver o problema
shahjapan

Respostas:

325

Usar

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

No Python 2.x, a sortedfunção recebe seus argumentos nesta ordem:

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

portanto, sem o key=, a função que você passar será considerada uma cmpfunção que recebe 2 argumentos.

kennytm
fonte
13
Você tem uma boa chance de aprender a apreciar a passagem de parâmetros de palavras-chave dessa experiência.
Tony Veijalainen 22/09/10
1
Isso é muito antigo, mas você tem alguma idéia de por que o código de erro é enganoso? Sua resposta parece possível O Python está fornecendo lambdaoutro parâmetro, já que uma cmpfunção leva 2?
SuperBiatedMan
@SuperBiatedMan, o erro não é enganoso. cmp, uma função comparadora usa dois argumentos. Se você não especificar que está passando a key, assume-se da ordem dos parâmetros de função que está passando um comparador. Seu lambda usa um parâmetro, portanto, não é um comparador válido e é isso que o erro diz.
Jezor 24/05
18
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Ele será impresso da seguinte maneira:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Trillionaire Sanai
fonte
Isso não funciona para números inteiros de sequência. Veja isso! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (chave = lambda x: x [1]) impressão (lst )
Daniel Kua
O resultado é [('303', '30'), ('343', '34'), ('999', '9')], que não é classificado com base no segundo elemento em todas as listas.
Daniel Kua
lst = [('doce', '999', '9'), ('maçã', '303', '30'), ('bebê', '343', '34')] lst.sort (chave = lambda x: x [2]) print (lst)
Daniel Kua
[('maçã', '303', '30'), ('bebê', '343', '34'), ('doce', '999', '9')]. O qual também não é classificado com base em 2 elementos!
Daniel Kua
7

As listas Python têm duas maneiras internas de classificar dados:

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

Com base nos seus requisitos, você pode escolher entre estes dois:

se você deseja manter a lista original, pode usar a função classificada ou, se não precisar da lista original, pode usar a função classificação.

Antes de prosseguir ou ordenar, precisamos entender lambda.

Um lambda é uma função anônima e uma função anônima é uma função definida sem nome, este post parece explicar muito bem.

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

As funções do Lambda são boas para chamar in-line, porque elas possuem apenas uma expressão que é avaliada e retornada. A sintaxe para uma lambda é:

argumentos lambda: expressão

vamos ver como usar a função classificada:

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

saída: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Aqui podemos ver a lista student_tuples com tuplas é classificada com base no parâmetro-chave, desde que seja aluno [2].

Preeti Duhan
fonte