ProgrammazioneSviluppatore Python

Come funziona la funzione sorted() in Python, quali sono le differenze rispetto al metodo sort() delle liste, quali sono i dettagli nell'uso della chiave key e del parametro reverse?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Storia della domanda:

Sin dall'inizio, il linguaggio Python ha fornito strumenti integrati per ordinare le collezioni. I metodi sort() e la funzione sorted() sono emersi nella seconda versione di Python, ma a partire da Python 2.4, sorted() è stata introdotta come strumento universale per ordinare qualsiasi oggetto iterabile (non solo le liste).

Problema:

Spesso è necessario ordinare i dati secondo diversi criteri e non sempre si vuole modificare l'oggetto originale. I principianti confondono sort() con sorted(), non capiscono dove venga applicato ciascuno e commettono errori con la chiave di ordinamento e l'ordine inverso.

Soluzione:

  • sorted(iterable, key=None, reverse=False) restituisce sempre un nuovo elenco oggetto, senza modificare l'originale.
  • list.sort(key=None, reverse=False) ordina la lista stessa in loco e restituisce None.
  • Il parametro key è una funzione che determina secondo quale criterio ordinare.
  • reverse=True inverte l'ordine.

Esempio di ordinamento di una lista di stringhe in base alla loro lunghezza, in ordine inverso:

words = ['python', 'is', 'strong', 'language'] sorted_words = sorted(words, key=len, reverse=True) print(sorted_words) # ['language', 'python', 'strong', 'is']

Caratteristiche chiave:

  • sorted() restituisce sempre un nuovo elenco, senza toccare la sorgente
  • sort() funziona solo con la lista stessa, non restituisce un nuovo oggetto
  • l'opzione key può essere qualsiasi funzione che restituisce valori per il confronto

Domande trabocchetto.

Cosa restituisce il metodo sort()?

Il metodo list.sort() ordina la lista stessa e restituisce sempre None, cosa che spesso viene dimenticata.

lst = [3, 1, 2] res = lst.sort() print(res) # None print(lst) # [1, 2, 3]

Si può ordinare una tupla con il metodo sort()?

No, le tuple sono immutabili e non hanno il metodo .sort(). Per ordinare, usa sorted().

tuple_data = (5,2,3) sorted_tuple = sorted(tuple_data) print(sorted_tuple) # [2, 3, 5]

Cosa succede se in key viene indicata una funzione che restituisce tipi diversi?

Si genera un'eccezione TypeError, se i valori restituiti non sono confrontabili tra di loro (ad esempio, int e str).

Errori comuni e anti-pattern

  • Usare sort() aspettandosi un nuovo elenco ordinato
  • Cercare di ordinare un oggetto immutabile con il metodo sort()
  • Fornire a key una funzione che restituisce valori di tipi eterogenei

Esempio di vita reale

Caso negativo

Durante il colloquio, viene richiesto di restituire un elenco ordinato per lunghezza, ma il candidato fa:

lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None

Vantaggi:

  • Modifica la lista in loco (a volte risparmia memoria)

Svantaggi:

  • Restituisce None, il che interrompe la logica successiva

Caso positivo

Uso corretto:

lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']

Vantaggi:

  • L'elenco originale non viene modificato
  • Otteniamo il risultato atteso

Svantaggi:

  • Occorre ulteriore memoria per il nuovo elenco