Ordinamento dell'elenco Python in base alla lunghezza della stringa


110

Voglio ordinare un elenco di stringhe in base alla lunghezza della stringa. Ho provato a usare l'ordinamento come segue, ma non sembra darmi il risultato corretto.

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

Cosa potrebbe esserci di sbagliato?

Risposte:


201

Quando si passa a lambdaa sort, è necessario restituire un numero intero, non un booleano. Quindi il tuo codice dovrebbe invece leggere come segue:

xs.sort(lambda x,y: cmp(len(x), len(y)))

Nota che cmp è una funzione incorporata tale che cmp(x, y)restituisce -1 se xè minore di y, 0 se xè uguale a ye 1 se xè maggiore di y.

Ovviamente puoi invece utilizzare il keyparametro:

xs.sort(key=lambda s: len(s))

Questo dice al sortmetodo di ordinare in base a ciò che restituisce la funzione chiave.

EDIT: Grazie a balpha e Ruslan di seguito per aver sottolineato che puoi semplicemente passare lendirettamente come parametro chiave alla funzione, eliminando così la necessità di lambda:

xs.sort(key=len)

E come Ruslan sottolinea di seguito, puoi anche utilizzare la funzione ordinata incorporata piuttosto che il list.sortmetodo, che crea un nuovo elenco anziché ordinare quello esistente sul posto:

print(sorted(xs, key=len))

32
Non c'è bisogno di lambda; basta usarekey = len
balpha

15
Questo ordina in ordine crescente (lunghezza delle parole più piccola in alto), per ordinare in ordine decrescente (lunghezza più piccola delle parole in basso) aggiungi un parametro reverse = True
Ajay Gupta

Il xs.sort()lancio "TypeError: sort () non accetta argomenti posizionali". Invece dovrebbe esserexs.sort(key=lambda x: len(x))
Hi-Angel,

84

Lo stesso della risposta di Eli - usando solo una forma più breve, perché qui puoi saltare una lambdaparte.

Creazione di un nuovo elenco:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

Ordinamento sul posto:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
Come faccio a invertire l'ordinamento sulla lunghezza?
user2922935

1
@ user2922935: Puoi eseguire xs [:: - 1] per invertire l'elenco già ordinato. Dai
un'occhiata

7
xs.sort(key=len, reverse=True)
Raz

5

Vorrei aggiungere come funziona la funzione chiave pitonica durante l'ordinamento:

Decorate-Sort-Undecorate Design Pattern:

Il supporto di Python per una funzione chiave durante l'ordinamento viene implementato utilizzando quello che è noto come design pattern decor-sort-undecorate.

Procede in 3 passaggi:

  1. Ogni elemento della lista viene temporaneamente sostituito con una versione “decorata” che include il risultato della funzione chiave applicata all'elemento.

  2. L'elenco è ordinato in base all'ordine naturale delle chiavi.

  3. Gli elementi decorati vengono sostituiti dagli elementi originali.

Parametro chiave per specificare una funzione da chiamare su ogni elemento della lista prima di effettuare confronti. docs


4

Il modo più semplice per farlo è:

list.sort (key = lambda x: len (x))


1

Scrivi una funzione lensort per ordinare un elenco di stringhe in base alla lunghezza.

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

Questo funziona per me!


0

Posso farlo usando i due metodi seguenti, usando function

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

In un Liner usando Lambda, come sotto, un già risposto sopra.

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.