2009-11-29 4 views
3
statlist = [('abc',5,1), ('bzs',66,1), ... ] 
sorted(statlist, key=lambda x: int(x[1])) 

Je veux trier par l'entier le plus grand au plus petit. Dans ce cas, 5 et 66. Mais cela ne semble pas fonctionner.Pourquoi ne puis-je pas trier cette liste?

+2

Que voulez-vous dire par « ne semble pas fonctionner?"S'il vous plaît, fournissez la trace d'erreur ou le problème spécifique que vous avez * réellement * –

+1

De plus, avec trois questions d'une nature n00b un dimanche après-midi, je devine que c'est devoirs.Veuillez marquer clairement les devoirs –

+0

J'ai oublié de mettre Je pensais que ça fonctionnait comme la fonction "sort" – TIMEX

Répondre

7

La fonction sorted retourne une nouvelle liste de sorte que vous devrez affecter les résultats de la fonction comme ceci:

new_list = sorted(statlist, key=lambda x: int(x[1])) 
+2

Cela ne fait pas ce que demande le PO, en citant "l'entier le plus grand au plus petit". –

+0

Sans rapport avec cela, mais quelqu'un pourrait-il me dire ce que signifie OP? Je l'ai vu dans d'autres messages aussi. Merci –

+0

Affiche originale. Puisque SO fonctionne comme un wiki, nous nous référons au tout premier utilisateur de cette façon, cela différencie ce qu'il a écrit de ce qui a été corrigé. –

3

Vous pouvez passer, la clé et la fonction inverse de .Sort

>>> x.sort(key=lambda x:x[1],reverse=True) 
>>> x 
[('bzs', 66, 1), ('abc', 5, 1)] 
>>> 
0
>>> s = [('xyz', 8, 1), ('abc',5,1), ('bzs',66,1) ] 
>>> s = sorted(s, key=lambda x: int(x[1])) 
>>> s.reverse() 
>>> print s 
[('bzs', 66, 1), ('xyz', 8, 1), ('abc', 5, 1)] 
7

utiliser la méthode .sort au lieu de tri:

statlist = [('abc',5,1), ('bzs',66,1), ... ] 
statlist.sort(key=lambda x: int(x[1])) 

Si vous souhaitez utiliser sorted, puis réattribuer la variable:

statlist = [('abc',5,1), ('bzs',66,1), ... ] 
statlist = sorted(statlist, key=lambda x: int(x[1])) 

Pour tri décroissant, utilisez reverse:

statlist = [('abc',5,1), ('bzs',66,1), ... ] 
statlist = sorted(statlist, key=lambda x: int(x[1]), reverse=True) 

Ensuite, vous feriez mieux d'utiliser itemgetter au lieu d'un lambda:

import operator 
statlist = [('abc',5,1), ('bzs',66,1), ... ] 
statlist = sorted(statlist, key=operator.itemgetter(1), reverse=True) 
2
from operator import itemgetter 
statlist = [('abc',5,1), ('bzs',66,1), ... ] 

# statlist.sort modifiest the statlist, sorted returns a new one 
# reverse puts the largest items to the front 
statlist.sort(key=itemgetter(1), reverse=True) 
3

pour le tri inplace

statlist.sort(key=lambda x: x[1]) 

pour créer une autre liste, avec les données triées utilisent

otherlist = sorted(statlist, key=lambda x: x[1]) 
1

En réponse au commentaire de alex qu'il pensait que Sorted() a travaillé "comme la fonction de tri" :

Si cela a fonctionné "comme la fonction de tri", il est peu probable qu'il ait été placé dans la bibliothèque.

Dans tous les cas, il n'y a pas de tri fonction ... vous faites référence à la méthode de tri d'objets de la liste.

démonstration simple en utilisant l'interpréteur interactif:

>>> alist = [3, 2, 1]; x = alist.sort(); print x; print alist 
None 
[1, 2, 3] 
>>> alist = [3, 2, 1]; x = sorted(alist); print x; print alist 
[1, 2, 3] 
[3, 2, 1] 

Voici une astuce: des patrons et des similitudes, mais toujours vérifier vos extrapolations intuitives. Vous pouvez appliquer ces idées à reverse et reversed.

0

Hey chaque fois que je sauve quelque chose à un tableau, je ne tends pas à vous soucier de l'ordre et à la fin j'utilise sorted() par exemple comme celui-ci statlist = sorted(statlist) et si on voulait le plus grand au plus petit statlist = sorted(statlist, reverse = True) C'est la façon simple devenir plus grand au plus petit!

code exemple où je l'ai utilisé ce (juste un extrait)

while i <= math.sqrt(intnum): 
     if (intnum % i) == 0: 
      numbers.insert(0,i) 
      numbers.insert(0,int(intnum/i)) 
      print(i,":", int(intnum/i)) 
     i += 1 
    numbers = sorted(numbers, reverse = True)