Funzioni per Ordinamenti

sort()

Il metodo ordina una lista, in ordine crescente, in loco

lista=[1, 8, 0, 1, 1, 9, 2, 8]
lista.sort()             
print(lista)                   # [0, 1, 1, 1, 2, 8, 8, 9]

Ordinare una lista in ordine decrescente

lista=[1, 8, 0, 1, 1, 9, 2, 8]
lista.sort(reverse=True) 
print(lista)                   # [9, 8, 8, 2, 1, 1, 1, 0]

reverse()

Il metodo capovolge una lista in loco

lista=[1, 8, 0, 1, 1, 9, 2, 8]
lista.sort()                   # [0, 1, 1, 1, 2, 8, 8, 9]
lista.reverse()                # [9, 8, 8, 2, 1, 1, 1, 0]

sorted()

La funzione restituisce una lista ordinata a partire dalla struttura dati specificata (insieme, lista, tupla, stringa, …).

tupla=(1, 8, 0, 1, 1, 9, 2, 8)
lista=sorted(tupla)     

print(tupla)                   # (1, 8, 0, 1, 1, 9, 2, 8)
print(lista)                   # [0, 1, 1, 1, 2, 8, 8, 9]

insieme={1, 8, 0, 1, 1, 9, 2, 8}
lista=sorted(insieme)     

print(insieme)                 # {1, 8, 0, 9, 2}
print(lista)                   # [0, 1, 2, 8, 9]

stringa="arcobaleno"
lista  =sorted(stringa) 

print(stringa)                 # arcobaleno
print(lista)                   # ['a', 'a', 'b', 'c', 'e', 'l', 'n', 'o', 'o', 'r']

Ordinare con un criterio

Si può chiedere alla funzione sort() di applicare una funzione agli elementi prima di ordinarli.

La funzione deve avere un solo argomento e restituire un valore

  • key = abs, valore numerico senza segno
  • key = id, il codice interno dell’oggetto
  • key = len, numero di elementi dell’elemento
  • key = max, valore massimo contenuto nell’elemento
  • key = min, valore minimo contenuto nell’elemento
  • key = round, valore numerico arrotondato
  • key = sum, somma dei valori numerici dell’elemento
  • key = str.lower, considera le stringhe tutte minuscolo
  • key = str.lstrip, considera le stringhe senza spazi iniziali
  • key = str.strip, considera le stringhe senza spazi iniziali e finali
  • key = str.swapcase, considera le stringhe con maiuscolo e minuscolo scambiati
  • key = str.upper, considera le stringhe tutte minuscolo
lista=[1, -8, 0, -1, 1, -9, 2, -8]

lista.sort(key=abs)      # [0, 1, -1, 1, 2, -8, -8, -9]

La funzione può essere arbitraria

def somma_codici(s):           # Somma dei codici ASCII della stringa
    somma=0 
    for c in s: 
        somma += ord(c) 
    return somma 

lista=["abc", "ax", "ac", "ad"]

lista.sort(key=somma_codici)   # ['ac', 'ad', 'ax', 'abc']

Ordinare rispetto a una posizione

Soluzione 1

def secondo(s):
    return s[1]

lista=["abc", "ax", "ac", "ad"]

lista.sort(key=secondo)        # ['abc', 'ac', 'ad', 'ax']

Soluzione 2

from operator import itemgetter

lista=["abc", "ax", "ac", "ad"]

lista.sort(key=itemgetter(1))  # ['abc', 'ac', 'ad', 'ax']

Studia gli algoritmi classici per ordinare una sequenza di dati: bubble sort, selection sort, quicksort, …