Guida Completa all’Ordinamento Dati in Python: sorted() vs .sort(), Chiavi Custom e Esercizi Pratici

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Ordinamento Dati Python Guida Essenziale

Ordinare Dati in Python

Ordinare i dati è un’operazione fondamentale in quasi ogni ambito della programmazione. Che si tratti di mostrare i risultati di una ricerca, organizzare record in un database o preparare dati per l’analisi, saper ordinare efficacemente è una skill essenziale. Python ci offre strumenti potenti e flessibili per farlo. In questa guida, esploreremo come.

Python offre diversi modi per ordinare dati: liste, dizionari, tuple, oggetti complessi. Vedremo i metodi principali con esempi pratici.

 

🔹 1. sorted() – Ordinamento che restituisce una nuova lista


numeri = [4, 1, 3, 2]
ordinati = sorted(numeri)
print(ordinati)  # [1, 2, 3, 4]

📌 Argomenti:

  • reverse=True: ordina in ordine decrescente
  • key=funzione: ordina secondo un criterio personalizzato

# Ordinamento decrescente
print(sorted(numeri, reverse=True))  # [4, 3, 2, 1]

# Ordinare stringhe per lunghezza
parole = ["python", "c", "java"]
print(sorted(parole, key=len))  # ['c', 'java', 'python']

🔹 2. .sort() – Ordinamento in-place (modifica la lista originale)


numeri = [4, 1, 3, 2]
numeri.sort()
print(numeri)  # [1, 2, 3, 4]

Argomenti:

  • reverse=True
  • key=funzione come in sorted()

parole = ["python", "c", "java"]
parole.sort(key=len, reverse=True)
print(parole)  # ['python', 'java', 'c']

🔹 3. Ordinare dizionari

✅ Per chiavi (default):


diz = {'b': 2, 'a': 1, 'c': 3}
print(sorted(diz))  # ['a', 'b', 'c']

✅ Per valori:


ordinato_per_valore = sorted(diz.items(), key=lambda x: x[1])
print(ordinato_per_valore)  # [('a', 1), ('b', 2), ('c', 3)]

Puoi trasformarlo di nuovo in dizionario con dict():


print(dict(ordinato_per_valore))

🔹 4. Ordinare liste di dizionari


studenti = [
    {"nome": "Alice", "voto": 90},
    {"nome": "Bob", "voto": 75},
    {"nome": "Clara", "voto": 82}
]

ordinati = sorted(studenti, key=lambda s: s["voto"])
for studente in ordinati:
    print(studente)

🔹 5. Ordinare liste di tuple


punteggi = [("Alice", 90), ("Bob", 75), ("Clara", 82)]
# Ordinare per secondo elemento (voto)
print(sorted(punteggi, key=lambda x: x[1]))

🔹 6. Ordinare stringhe

Ordinare lettere in una stringa:


s = "python"
print("".join(sorted(s)))  # hnopty

🔹 7. Ordinare insiemi (set)

Gli insiemi non sono ordinati per natura, ma puoi ordinarli creando una lista:


insieme = {4, 1, 3}
ordinato = sorted(insieme)
print(ordinato)  # [1, 3, 4]

🔹 8. Ordinare liste di oggetti personalizzati

Spesso lavoriamo con oggetti definiti da noi stessi. Python ci permette di ordinarli facilmente specificando l’attributo su cui basare l’ordinamento.


class Persona:
    def __init__(self, nome, eta):
        self.nome = nome
        self.eta = eta

    # Questo metodo è utile per una rappresentazione leggibile dell'oggetto
    def __repr__(self):
        return f"Persona(nome='{self.nome}', eta={self.eta})"

persone_obj = [
    Persona("Luca", 30),
    Persona("Anna", 25),
    Persona("Marco", 35)
]

# Ordiniamo la lista di oggetti 'Persona' per età
ordinati_obj = sorted(persone_obj, key=lambda p: p.eta)

for persona in ordinati_obj:
    print(persona)
```

Output atteso:


Persona(nome='Anna', eta=25)
Persona(nome='Luca', eta=30)
Persona(nome='Marco', eta=35)

Spiegazione dell’Esercizio:

Questo esercizio mostra come puoi ordinare una lista che contiene oggetti creati da te, non solo i tipi di dato built-in di Python come numeri o stringhe.

  • Definizione della Classe Persona:
    Abbiamo creato una classe semplice chiamata Persona. Ogni oggetto Persona ha due attributi: nome e eta (età).
    Il metodo speciale __repr__ serve a fornire una rappresentazione stringa chiara dell’oggetto quando lo stampi. Questo rende l’output molto più leggibile, mostrandoti il nome e l’età di ogni persona.
  • Creazione della Lista di Oggetti:
    Poi, creiamo una lista chiamata persone_obj che contiene tre istanze (oggetti) della classe Persona, ognuna con un nome e un’età diversi.
  • Ordinamento con sorted() e lambda:
    Usiamo la funzione sorted() (come abbiamo visto in precedenza) per creare una nuova lista ordinata.
    La chiave qui è l’espressione lambda p: p.eta. Questa lambda dice a Python: “Per ogni oggetto p nella lista, usa il suo attributo eta come criterio per l’ordinamento.”
    Di default, sorted() ordina in ordine crescente, quindi gli oggetti verranno ordinati dall’età più bassa a quella più alta.
  • Stampa del Risultato:
    Infine, iteriamo sulla lista ordinati_obj e stampiamo ogni oggetto Persona. Grazie al metodo __repr__, vediamo un output facile da capire che conferma l’ordinamento per età.
Forse potrebbe interessarti anche:  Cos’è la Burstiness nei Testi e Perché Può Svelare se un Contenuto è Scritto da un’AI

Questo esempio è fondamentale perché ti mostra come Python possa ordinare tipi di dati complessi basandosi su attributi specifici degli oggetti, il che è estremamente utile quando lavori con dati strutturati e le tue proprie definizioni di oggetti.

🔹 9. Ordinamento complesso con operator module (opzionale)


from operator import itemgetter

# Lista di tuple
dati = [("a", 3), ("b", 1), ("c", 2)]
print(sorted(dati, key=itemgetter(1)))  # [('b', 1), ('c', 2), ('a', 3)]

🔹 10. Ordinamento stabile

Python utilizza un algoritmo stabile per l’ordinamento (Timsort), quindi mantiene l’ordine originale in caso di parità nei valori.

 Esercizio pratico

Ordina la seguente lista di studenti prima per voto decrescente, poi per nome crescente in caso di parità:


studenti = [
    {"nome": "Anna", "voto": 90},
    {"nome": "Bruno", "voto": 85},
    {"nome": "Alice", "voto": 90}
]

ordinati = sorted(studenti, key=lambda x: (-x["voto"], x["nome"]))
for s in ordinati:
    print(s)

✅ Conclusione

Metodo Tipo di dato In-place Personalizzazione (key) Decrescente
sorted() Qualsiasi iterabile ❌ ✅ ✅
.sort() Solo liste ✅ ✅ ✅

5 Esercizi Risolti sull’Ordinamento in Python per Principianti

Ecco 5 esercizi risolti passo a passo sull’ordinamento in Python, con spiegazione e output atteso per ciascuno. Sono adatti a un principiante che vuole imparare bene come funziona sorted() e .sort().

🔸 Esercizio 1 – Ordinare una lista di numeri interi in ordine crescente e decrescente

✅ Obiettivo:

Dato l’elenco [8, 3, 1, 7, 0, 10, 2], ordina:

  • In ordine crescente
  • In ordine decrescente

 Soluzione:


numeri = [8, 3, 1, 7, 0, 10, 2]

# Ordinamento crescente
crescente = sorted(numeri)

# Ordinamento decrescente
decrescente = sorted(numeri, reverse=True)

print("Crescente:", crescente)
print("Decrescente:", decrescente)

Output atteso:


Crescente: [0, 1, 2, 3, 7, 8, 10]
Decrescente: [10, 8, 7, 3, 2, 1, 0]

🔸 Esercizio 2 – Ordinare parole in base alla lunghezza

✅ Obiettivo:

Data la lista ["mela", "banana", "kiwi", "pera"], ordina le parole in base alla lunghezza (dalla più corta alla più lunga).

Soluzione:


parole = ["mela", "banana", "kiwi", "pera"]
ordinate = sorted(parole, key=len)
print("Ordinamento per lunghezza:", ordinate)

Output atteso:


Ordinamento per lunghezza: ['kiwi', 'mela', 'pera', 'banana']

🔸 Esercizio 3 – Ordinare una lista di tuple per il secondo valore

✅ Obiettivo:

Data la lista [("a", 3), ("b", 1), ("c", 2)], ordina le tuple in base al secondo elemento.

 Soluzione:


dati = [("a", 3), ("b", 1), ("c", 2)]
ordinati = sorted(dati, key=lambda x: x[1])
print("Ordinati per secondo elemento:", ordinati)

Output atteso:


Ordinati per secondo elemento: [('b', 1), ('c', 2), ('a', 3)]

🔸 Esercizio 4 – Ordinare una lista di dizionari per un campo

✅ Obiettivo:

Ordina questa lista di dizionari in base al valore del campo “età”:


persone = [
    {"nome": "Alice", "età": 30},
    {"nome": "Bob", "età": 25},
    {"nome": "Clara", "età": 35}
]

Soluzione:


persone = [
    {"nome": "Alice", "età": 30},
    {"nome": "Bob", "età": 25},
    {"nome": "Clara", "età": 35}
]

ordinate = sorted(persone, key=lambda p: p["età"])
for persona in ordinate:
    print(persona)

Output atteso:


{'nome': 'Bob', 'età': 25}
{'nome': 'Alice', 'età': 30}
{'nome': 'Clara', 'età': 35}

🔸 Esercizio 5 – Ordinare in modo combinato (prima per voto decrescente, poi per nome)

✅ Obiettivo:

Ordina una lista di studenti prima per voto (dal più alto al più basso), poi per nome in ordine alfabetico in caso di parità:


studenti = [
    {"nome": "Anna", "voto": 90},
    {"nome": "Bruno", "voto": 85},
    {"nome": "Alice", "voto": 90}
]

Soluzione:


studenti = [
    {"nome": "Anna", "voto": 90},
    {"nome": "Bruno", "voto": 85},
    {"nome": "Alice", "voto": 90}
]

ordinati = sorted(studenti, key=lambda s: (-s["voto"], s["nome"]))
for s in ordinati:
    print(s)
```

 Output atteso:


{'nome': 'Alice', 'voto': 90}
{'nome': 'Anna', 'voto': 90}
{'nome': 'Bruno', 'voto': 85}

Pubblicità

Esercizi avanzati

Ecco 3 esercizi di livello intermedio e 1 esercizio livello “Hero”, tutti risolti passo a passo . Gli esercizi approfondiscono l’uso di sorted(), .sort(), lambda, itemgetter e ordinamenti condizionati.

Forse potrebbe interessarti anche:  Algoritmo Minimax con Python per il Tris: Implementazione con Potatura Alpha-Beta e Visualizzazione dell'Albero di Ricerca

🟡 Livello Intermedio – Esercizio 1

🎯 Ordinare un dizionario per lunghezza delle chiavi

✅ Obiettivo:

Dato il dizionario seguente, ordina i suoi elementi in base alla lunghezza delle chiavi, in modo crescente.


d = {
    "albero": 3,
    "pianta": 2,
    "a": 5,
    "arbusto": 1
}

🧪 Soluzione:


d = {
    "albero": 3,
    "pianta": 2,
    "a": 5,
    "arbusto": 1
}

# sorted() restituisce una lista di tuple (chiave, valore)
# La funzione lambda prende ogni item (che è una tupla, es. ('albero', 3))
# e restituisce la lunghezza della chiave (item[0]) per l'ordinamento.
ordinati = sorted(d.items(), key=lambda item: len(item[0]))

print("Dizionario ordinato per lunghezza delle chiavi:")
for k, v in ordinati:
    print(k, ":", v)

🧾 Output atteso:


a : 5
pianta : 2
albero : 3
arbusto : 1

🟡 Livello Intermedio – Esercizio 2

🎯 Ordinare una lista di stringhe ignorando le maiuscole

✅ Obiettivo:

Data la lista ["mario", "Luca", "andrea", "Giovanni"], ordina le parole in ordine alfabetico ignorando la distinzione tra maiuscole e minuscole.

🧪 Soluzione:


nomi = ["mario", "Luca", "andrea", "Giovanni"]

# Usiamo la funzione key=lambda nome: nome.lower()
# Questo fa sì che la stringa venga temporaneamente convertita in minuscolo per il confronto,
# ma l'elemento originale (con la sua capitalizzazione) viene mantenuto nella lista finale.
ordinati = sorted(nomi, key=lambda nome: nome.lower())

print("Ordinati (case insensitive):", ordinati)

🧾 Output atteso:


Ordinati (case insensitive): ['andrea', 'Giovanni', 'Luca', 'mario']

🟡 Livello Intermedio – Esercizio 3

🎯 Ordinare per più criteri: prodotti per prezzo crescente, poi per nome

✅ Obiettivo:

Data la lista di dizionari seguente, ordina i prodotti prima per “prezzo” in ordine crescente. In caso di prodotti con lo stesso prezzo, ordinali ulteriormente per “nome” in ordine alfabetico crescente.


prodotti = [
    {"nome": "pane", "prezzo": 2.5},
    {"nome": "latte", "prezzo": 1.5},
    {"nome": "pasta", "prezzo": 1.5},
    {"nome": "olio", "prezzo": 5.0}
]

🧪 Soluzione:


prodotti = [
    {"nome": "pane", "prezzo": 2.5},
    {"nome": "latte", "prezzo": 1.5},
    {"nome": "pasta", "prezzo": 1.5},
    {"nome": "olio", "prezzo": 5.0}
]

# Quando la key è una tupla, Python ordina gli elementi della tupla
# in sequenza (primo elemento, poi secondo, e così via).
# Qui, ordiniamo prima per p["prezzo"] e poi per p["nome"] se i prezzi sono uguali.
ordinati = sorted(prodotti, key=lambda p: (p["prezzo"], p["nome"]))

print("Prodotti ordinati per prezzo e poi per nome:")
for p in ordinati:
    print(p)

🧾 Output atteso:


{'nome': 'latte', 'prezzo': 1.5}
{'nome': 'pasta', 'prezzo': 1.5}
{'nome': 'pane', 'prezzo': 2.5}
{'nome': 'olio', 'prezzo': 5.0}

🔴 Livello “Hero” – Esercizio 4

 Ordinare una lista mista di numeri e stringhe alfabeticamente (numeri prima, poi stringhe), ignorando maiuscole e ordinando i numeri come numeri

✅ Obiettivo:

Data una lista contenente sia numeri che stringhe, ordina gli elementi in modo che tutti i numeri appaiano per primi (ordinati numericamente), seguiti da tutte le stringhe (ordinate alfabeticamente, ignorando le maiuscole).


dati = [100, "banana", 3, "Ananas", "zucchero", 1]

 Strategia:

  1. Separare la lista originale in due liste: una per i numeri e una per le stringhe.
  2. Ordinare la lista dei numeri in modo standard (numerico).
  3. Ordinare la lista delle stringhe in modo case-insensitive.
  4. Concatenare le due liste ordinate (numeri prima, poi stringhe).
Forse potrebbe interessarti anche:  Collaborative Filtering: Come Funziona l'Algoritmo che Sceglie i Tuoi Film Preferiti?

 Soluzione:


dati = [100, "banana", 3, "Ananas", "zucchero", 1]

# Filtra e ordina i numeri
# isinstance(x, (int, float)) verifica se l'elemento è un intero o un float
numeri = sorted([x for x in dati if isinstance(x, (int, float))])

# Filtra e ordina le stringhe (case-insensitive)
stringhe = sorted([x for x in dati if isinstance(x, str)], key=lambda s: s.lower())

# Unisci le due liste ordinate
risultato = numeri + stringhe

print("Dati ordinati:", risultato)

 Output atteso:


Dati ordinati: [1, 3, 100, 'Ananas', 'banana', 'zucchero']

Ora hai visto:

  • ordinamenti avanzati con lambda per criteri personalizzati
  • gestione di tipi di dati diversi all’interno della stessa lista per un ordinamento logico
  • ordinamenti multi-criterio per gestire priorità di ordinamento

Questi esercizi ti hanno fornito una solida base per affrontare scenari di ordinamento più complessi in Python.

Pubblicità