Comment trier avec lambda en Python

179

En Python, j'essaye de trier par date avec lambda. Je ne comprends pas mon message d'erreur. Le message est:

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

La ligne que j'ai est

a = sorted(a, lambda x: x.modified, reverse=True)
Niklas R.
la source
8
ajouter l'argument keywoard key = lambda x: x.modified résoudra le problème
shahjapan

Réponses:

325

Utilisation

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

Sur Python 2.x, la sortedfonction prend ses arguments dans cet ordre:

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

donc sans le key=, la fonction que vous transmettez sera considérée comme une cmpfonction qui prend 2 arguments.

KennyTM
la source
13
Vous avez de bonnes chances d'apprendre à apprécier la transmission de paramètres de mots-clés grâce à cette expérience.
Tony Veijalainen le
1
C'est très ancien, mais avez-vous une idée de la raison pour laquelle le code d'erreur est trompeur? Votre réponse semble possible que Python fournisse lambdaun autre paramètre puisqu'une cmpfonction prend 2?
SuperBeasedMan
@SuperBiasMan l'erreur n'est pas trompeuse. cmp, une fonction de comparaison prend deux arguments. Si vous ne spécifiez pas que vous passez a key, il est supposé à partir de l'ordre des paramètres de fonction que vous passez un comparateur. Votre lambda prend un paramètre, n'est donc pas un comparateur valide et c'est ce que dit l'erreur.
Jezor
19
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

Il s'imprimera comme suit:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Trillionaire Sanai
la source
Cela ne fonctionne pas pour les entiers de chaîne. Regarde ça! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort (clé = lambda x: x [1]) print (lst )
Daniel Kua
Le résultat est [('303', '30'), ('343', '34'), ('999', '9')] qui n'est pas trié en fonction du deuxième élément de chaque liste.
Daniel Kua
lst = [('candy', '999', '9'), ('apple', '303', '30'), ('baby', '343', '34')] lst.sort (clé = lambda x: x [2]) print (lst)
Daniel Kua
[('pomme', '303', '30'), ('bébé', '343', '34'), ('candy', '999', '9')]. Ce qui n'est pas trié sur la base de 2 éléments aussi!
Daniel Kua
8

Les listes Python ont deux méthodes intégrées pour trier les données:

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

En fonction de vos besoins, vous pouvez choisir parmi ces deux:

si vous souhaitez conserver la liste d'origine, vous pouvez utiliser la fonction triée ou si vous n'avez pas besoin de la liste d'origine, vous pouvez utiliser la fonction de tri.

Avant de procéder au tri ou au tri, nous devons comprendre lambda.

Un lambda est une fonction anonyme et une fonction anonyme est une fonction qui est définie sans nom, ce post semble l'expliquer assez bien.

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

Les fonctions Lambda sont utiles pour les appels en ligne car elles n'ont qu'une seule expression qui est évaluée et renvoyée. Leur syntaxe pour un lambda est:

arguments lambda: expression

voyons comment utiliser la fonction triée:

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

sortie: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Ici, nous pouvons voir que la liste student_tuples ayant des tuples est triée en fonction du paramètre clé à condition que student [2].

Preeti Duhan
la source