Storia della questione:
Il metodo sort() è incorporato nel tipo list sin dalle prime versioni di Python, mentre la funzione sorted() è apparsa in Python 2.4. La classificazione delle collezioni è uno dei compiti più frequenti nella programmazione e Python offre due strumenti principali per risolverlo.
Problema:
Molti principianti confondono sort() (metodo della lista) e sorted() (funzione di alto livello). Non c'è comprensione su quando utilizzare la classificazione in loco, quali oggetti possono essere ordinati, come specificare un ordine arbitrario tramite key/reverse, a quali possibili trappole questo porta, specialmente per strutture complesse definite dall'utente.
Soluzione:
list.sort() ordina la lista originale in loco e restituisce None. Modifica l'oggetto originale.sorted() restituisce una nuova lista ordinata (o un altro tipo, se passato un valore diverso), senza modificare l'originale. Funziona con qualsiasi oggetto iterabile (anche con generatori).key (funzione di ordinamento) e reverse (flag booleano per ordinare in ordine inverso).Esempio di codice:
numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words rimane invariato
Caratteristiche chiave:
sort() funziona solo per liste e ordina in loco (sul posto), sorted() è più versatile — funziona con qualsiasi oggetto iterabile.Cosa restituirà la variabile se si fa my_list = my_list.sort()?
Risposta: my_list sarà None, perché sort ordina la lista in loco e restituisce None. Questo è un bug comune: si consiglia di ordinare in loco senza assegnazione, oppure utilizzare sorted se è necessario un oggetto ordinato come nuova lista.
Esempio di codice:
lst = [3, 1, 2] lst = lst.sort() # lst ora è None
È possibile ordinare una tupla o una stringa con il metodo sort()?
Risposta: No, gli oggetti immutabili (tuple, str) non hanno il metodo sort, ma è possibile applicare sorted(), che restituisce una nuova lista ordinata degli elementi.
Esempio di codice:
tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]
È possibile ordinare una lista con elementi di diversi tipi?
Risposta: In Python 3 l'ordinamento di tipi non comparabili diversi (ad esempio, int e str) genera un TypeError. In Python 2 esisteva un ordine specifico, ora è necessario specificare esplicitamente la funzione key per generalizzare tutti i valori in una forma comparabile.
Caso negativo
Il programmatore ha fatto my_list = my_list.sort(), dopodiché ha perso l'accesso alla lista originale, poiché alla variabile è stato assegnato il valore None.
Vantaggi:
Svantaggi:
Caso positivo
Hanno utilizzato l'accorto sorted() per ottenere una nuova versione senza modificare l'originale, oppure hanno applicato correttamente sort, senza effettuare assegnazioni.
Vantaggi:
Svantaggi: