Elenchi Python

Python ha un ottimo tipo di elenco integrato denominato "list". I valori letterali degli elenchi sono scritti tra parentesi quadre [ ]. Gli elenchi funzionano in modo simile alle stringhe: utilizza la funzione len() e le parentesi quadre [ ] per accedere ai dati, con il primo elemento all'indice 0. (consulta la documentazione ufficiale dell'elenco di python.org).

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

elenco di stringhe "red" "blue" "green"

L'assegnazione con un segno = negli elenchi non viene creata una copia. L'assegnazione fa invece in modo che le due variabili puntino allo stesso elenco in memoria.

  b = colors   ## Does not copy the list

sia i colori che b rimandano all'elenco uno

L'"elenco vuoto" è semplicemente una coppia vuota di parentesi [ ]. Il "+" funziona per aggiungere due liste, quindi [1, 2] + [3, 4] restituisce [1, 2, 3, 4] (questo è proprio come + con le stringhe).

FOR e IN

I costrutti *for* e *in* di Python sono estremamente utili e il primo utilizzo che vedremo è con gli elenchi. La costruzione *for* (for var in list) è un modo semplice per esaminare ogni elemento di un elenco (o di un'altra raccolta). Non aggiungere o rimuovere elementi dall'elenco durante l'iterazione.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Se sai che tipo di elementi c'è nell'elenco, utilizza nel loop un nome di variabile che acquisisca tali informazioni, ad esempio "num", "nome" o "url". Poiché il codice Python non ha altre sintassi che ti ricordano i tipi, i nomi delle variabili sono un modo fondamentale per stabilire cosa sta succedendo. (Questa affermazione è un po' fuorviante. Man mano che acquisisci maggiore familiarità con Python, vedrai riferimenti ai suggerimenti di tipo che ti consentono di aggiungere informazioni sul tipo alle definizioni delle funzioni. Python non utilizza questi suggerimenti di tipo quando esegue i tuoi programmi. Vengono utilizzati da altri programmi come gli IDE (Integrated Development Environment) e gli strumenti di analisi statica come i linters/i controlli dei tipi per convalidare se le funzioni vengono chiamate con argomenti compatibili.

La costruzione *in* da sola è un modo semplice per verificare se un elemento compare in un elenco (o in un'altra raccolta). value in collection verifica se il valore è nella raccolta, restituendo True/False.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Le strutture for/in sono molto utilizzate nel codice Python e funzionano su tipi di dati diversi dall'elenco, quindi devi solo memorizzare la loro sintassi. Potresti avere l'abitudine di altri linguaggi in cui inizi a eseguire manualmente l'iterazione su una raccolta, mentre in Python devi solo utilizzare for/in.

Puoi anche utilizzare for/in per lavorare su una stringa. La stringa agisce come un elenco dei suoi caratteri, quindi for ch in s: print(ch) stampa tutti i caratteri di una stringa.

Intervallo

La funzione intervallo(n) restituisce i numeri 0, 1, ... n-1, e l'intervallo(a, b) restituisce a, a+1, ... b-1 -- fino all'ultimo numero escluso. La combinazione del ciclo for e della funzione range() consente di creare un ciclo for numerico tradizionale:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Esiste una variante xrange() che evita il costo di creazione dell'intero elenco per i casi sensibili al rendimento (in Python 3, range() avrà un buon comportamento in termini di prestazioni e puoi dimenticare xrange()).

Ciclo while

Python ha anche il ciclo while standard e le istruzioni *break* e *continue* funzionano come in C++ e Java, modificando il corso del ciclo più interno. I loop for/in riportati sopra risolvono il caso comune di iterazione su ogni elemento di un elenco, ma il ciclo mentre ti dà il controllo totale sui numeri di indice. Ecco un ciclo while che accede a ogni terzo elemento di un elenco:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Elenco metodi

Di seguito sono riportati altri metodi di elenco comuni.

  • list.append(elem) - aggiunge un singolo elemento alla fine dell'elenco. Errore comune: non restituisce il nuovo elenco, ma modifica solo quello originale.
  • list.insert(index, elem) - inserisce l'elemento nell'indice specificato, spostando gli elementi verso destra.
  • list.extend(list2) aggiunge gli elementi in list2 alla fine dell'elenco. L'uso di + o += in un elenco è simile all'utilizzo di extensions().
  • list.index(elem): cerca l'elemento specificato dall'inizio dell'elenco e restituisce il relativo indice. Genera un ValueError se l'elemento non viene visualizzato (utilizza "in" per eseguire la verifica senza un ValueError).
  • list.remove(elem) - cerca la prima istanza dell'elemento specificato e la rimuove (viene generato un ValueError se non è presente)
  • list.sort() - ordina l'elenco in situ (non lo restituisce). È preferibile utilizzare la funzione sorted() mostrata di seguito.
  • list.reverse() - inverte l'elenco in situ (non lo restituisce)
  • list.pop(index) rimuove e restituisce l'elemento all'indice specificato. Restituisce l'elemento più a destra se l'indice viene omesso (circa l'opposto di append()).

Tieni presente che si tratta di *metodi* su un oggetto elenco, mentre len() è una funzione che prende l'elenco (o la stringa o altro) come argomento.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Errore comune: tieni presente che i metodi sopra riportati non *restituiscono* l'elenco modificato, ma modificano solo l'elenco originale.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

Elenco di build

Un pattern comune è iniziare un elenco come elenco vuoto [], quindi utilizzare append() o extend() per aggiungere elementi:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Elenco sezioni

I segmenti funzionano sugli elenchi come con le stringhe e possono essere utilizzati anche per modificare sottoparti dell'elenco.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Esercizio: list1.py

Per esercitarti con il materiale di questa sezione, prova i problemi in list1.py che non utilizzano l'ordinamento (negli Esercizi di base).