Se vuoi imparare le liste in un formato da corso, dai un'occhiata al nostro corso Introduzione a Python per la Data Science, che include un capitolo sulle liste in Python.
Contesto
Le liste sono un argomento sempre più popolare sia per chi inizia a imparare Python sia per chi ha già esperienza con il linguaggio. Se diamo credito ai risultati di ricerca su Google Trends, l'interesse di ricerca per questo tema è aumentato anno dopo anno.
Se frequenti regolarmente forum per rispondere o porre domande sulla programmazione in Python, come Stack Overflow, Quora o Reddit, potresti già sapere il perché.
Molte domande su Python finiscono su questi forum e continuano a circolare lì, dove gli utenti le segnano come "duplicate" o "sticky", le votano o discutono insieme la soluzione corretta.
Con questo post, DataCamp vuole aiutarti ad affrontare un argomento, ossia le domande più frequenti sulle liste in Python, e farlo in modo interattivo!
Che cos'è esattamente una lista in Python?
Le liste sono una delle quattro strutture dati integrate in Python, insieme a tuple, dizionari e set. Servono per memorizzare una raccolta ordinata di elementi, che possono anche essere di tipi diversi, ma di solito non lo sono. Le virgole separano gli elementi contenuti in una lista, racchiusa tra parentesi quadre. Proprio come in questo esempio:
# These list elements are all of the same type
zoo = ['bear', 'lion', 'panda', 'zebra']
print(zoo)
# But these list elements are not
biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']]
print(biggerZoo)Vedi che la seconda variabile biggerZoo è una lista simile alla variabile zoo. Tuttavia, noti anche che biggerZoo contiene un'altra lista con diversi tipi di scimmie all'interno.
Poiché le liste in Python memorizzano raccolte ordinate di elementi o oggetti, possiamo dire che sono tipi sequenza, proprio perché si comportano come una sequenza. Altri tipi considerati sequenze sono le stringhe e le tuple.
Potresti chiederti cosa ci sia di speciale nei tipi sequenza. In parole semplici, significa che il programma può iterarci sopra! Ecco perché liste, stringhe, tuple e set sono chiamati "iterabili".
Ricorda che questo concetto è particolarmente importante e potresti ritrovarlo in altri linguaggi di programmazione usati nella data science, come Scala!
Ora passiamo al lavoro vero e proprio! Approfondiamo le domande sulle liste che potrebbero averti assillato come programmatore Python. Ecco l'elenco di tutte le domande a cui risponderemo in questo tutorial:
1. Quando usare le liste in Python e quando usare tuple, dizionari o set
L'introduzione sembra piuttosto semplice quando la leggi, ma quando lavori davvero su un piccolo script Python o su un intero progetto, la scelta tra una lista o un altro tipo sequenza potrebbe non essere così chiara.
Tuttavia, scegliere la struttura dati giusta per i tuoi dati è essenziale!
Continua a leggere per saperne di più.
Liste vs Tuple
Le tuple servono per raccogliere un elenco ordinato e immutabile di elementi. Questo significa che:
- Non puoi aggiungere elementi a una tupla. Non esistono i metodi
append()oextend()per le tuple, - Non puoi rimuovere elementi da una tupla. Le tuple non hanno i metodi
remove()opop(), - Puoi cercare elementi in una tupla, perché questo non la modifica.
- Puoi anche usare l'operatore
inper verificare se un elemento esiste nella tupla.
Quindi, se stai definendo un insieme costante di valori e tutto quello che farai sarà iterarci sopra, usa una tupla invece di una lista. Sarà più veloce delle liste e anche più sicura, dato che le tuple contengono dati "protetti in scrittura".
Liste vs Dizionari
- Una lista memorizza una raccolta ordinata di elementi, quindi mantiene un certo ordine. I dizionari non hanno un ordine.
- I dizionari associano ogni chiave a un valore, mentre le liste contengono solo valori.
Usa un dizionario quando hai un insieme non ordinato di chiavi uniche che mappano a valori.
Nota che, poiché hai chiavi e valori collegati tra loro, le prestazioni saranno migliori rispetto alle liste nei casi in cui verifichi l'appartenenza di un elemento.
Liste vs Set
- Come i dizionari, i set non hanno ordine nella loro raccolta di elementi. A differenza delle liste.
- I set richiedono che gli elementi contenuti siano hashable, le liste possono contenere elementi non hashable.
- I set richiedono che i tuoi elementi siano unici e immutabili. Nei set non sono ammessi duplicati, mentre le liste consentono duplicati e sono mutabili.
Dovresti usare i set quando hai un insieme non ordinato di valori unici, immutabili e hashable.
Non sei sicuro di quali valori siano hashable?
Dai un'occhiata qui sotto per sicurezza:
| Hashable | Non hashable |
|---|---|
| Float | Dizionari |
| Interi | Set |
| Tuple | Liste |
| Stringhe | |
frozenset() |
Consiglio: non fidarti solo della nostra parola! Provalo tu stesso qui sotto ed esercitati nella shell IPython :)
# Import the `collections` library
____ ____
# Check if a dictionary is hashable
print(isinstance({}, collections.Hashable))
# Check if a float is hashable
print(isinstance(0.125, collections.Hashable))Nota che, lavorando con elementi hashable, il controllo dell'appartenenza (testare se un certo elemento fa parte della tua sequenza) sarà più veloce con i set che con le liste.
2. Come selezionare un elemento da una lista
Se vuoi lavorare correttamente con queste liste, devi sapere come accedervi.
Tipicamente accedi alle liste per cambiare alcuni valori, aggiornarli o eliminarli, o per eseguire qualche altra operazione su di essi. Il modo in cui accedi alle liste, e per estensione a tutti gli altri tipi sequenza, è usando l'operatore di indice [ ]. All'interno, metti un valore intero.
Ti mostro un esempio:
# Select the first list element
oneZooAnimal = biggerZoo[0]
# Print `oneZooAnimal`
print(____)Esegui il codice e guarda cosa ottieni. Noterai che viene restituito il primo elemento della variabile biggerZoo. Può essere un po' confuso o sorprendente all'inizio, ma gli indici partono da 0 e non da 1.
Come ottenere l'ultimo elemento di una lista
La risposta a questa domanda è un'aggiunta alla spiegazione della sezione precedente.
Prova a mettere un valore negativo, come -1 o -2, nell'operatore di indice per recuperare l'ultimo elemento della nostra lista biggerZoo!
Niente di troppo difficile, vero?
Cosa significa l'errore "Index out of range"?
Questo è un errore che vedrai spesso, soprattutto quando sei alle prime armi con la programmazione o con Python.
Il modo migliore per capire cosa significa è provarlo tu stesso.
Usa il widget di apprendimento interattivo qui sopra e prova a passare numeri negativi troppo piccoli o positivi molto grandi!
Come puoi vedere, potresti ottenere un errore "Index Out Of Range" nei casi in cui passi all'operatore di indice un valore intero più grande o molto più piccolo della tua lista! Significa che stai assegnando un valore o facendo riferimento a un indice che non esiste (ancora).
Questo è un esempio di codice che produrrà un errore "Index Out Of Range". Lascialo eseguire e verifica tu stesso!
# Run this code to trigger an "Index Out Of Range" Error
biggerZoo[6]La notazione di slice nelle liste
Quando sei nuovo alla programmazione o a Python, questo può essere un argomento particolarmente confuso.
In generale, usi la notazione di slice quando vuoi selezionare più di un elemento di una lista alla volta. Proprio come quando scegli un solo elemento da una lista, usi le doppie parentesi quadre. La particolarità è che, invece di un solo intero, inserisci anche un : tra le parentesi, proprio così:
# Use the slice notation like this
someZooAnimals = biggerZoo[2: ]
# Print to see what you exactly select from `biggerZoo`
print(someZooAnimals)
# Try putting 2 on the other side of the colon
otherZooAnimals = biggerZoo[____]
# Print to see what you're getting back
print(otherZooAnimals)Vedi che ora otteniamo la lista biggerZoo, ma solo a partire dall'elemento panda all'indice 2 in poi. In altre parole, partiamo dall'indice 2 e andiamo fino alla fine della lista, poiché non è specificato un altro intero.
E se facciamo il contrario, secondo te cosa succede?
Scopri se hai ragione eseguendo il blocco di codice qui sopra!
Vedi che ora otteniamo solo bear e lion. Ora partiamo dall'indice 0 e arriviamo all'indice 2. Contrariamente a quanto potresti aspettarti, il risultato non include l'elemento panda.
In generale, vale quanto segue:
# items start through the end (but the end is not included!)
a[start:end]
# items start through the rest of the array
a[start:]
# items from the beginning through the end (but the end is not included!)
a[:end]
Consiglio: passando solo i due punti :, copierai semplicemente la lista!
Oltre alla semplice notazione di slice, c'è anche il valore di step, che si può generalizzare così:
# start through not past end, by step
a[start:end:step]
Allora cosa fa esattamente questo valore di step?
Ti permette letteralmente di "saltellare" nella lista e selezionare solo quegli elementi compresi nello step. Un esempio:
# Print to see how the step value influences your result
print(biggerZoo[2::2])
print(biggerZoo[1::3])Nota che se non specifichi alcun valore di step, questo è impostato a 1. Nessun elemento verrà saltato quando si scorre la lista.
Ricorda che il tuo risultato non include l'indice di fine specificato nella notazione di slice!
Come selezionare casualmente un elemento in una lista
Puoi selezionare un elemento casuale dalla tua lista con il pacchetto random:
# Import `choice` from the `random` library
from ____ import ____
# Construct your `list` variable with a list of the first 4 letters of the alphabet
list = ['_','_','_','_']
# Print your random 'list' element
print(choice(list))Se vuoi selezionare un elemento casuale della lista tramite gli indici, puoi usare il metodo randrange della libreria random:
# Import `randrange` from the `random` library
from ____ import ____
# Construct your `randomLetters` variable with a list of the first 4 letters of the alphabet
randomLetters = ['_','_', '_', '_']
# Select a random index from 'randomLetters`
randomIndex = randrange(0,len(randomLetters))
# Print your random element from `random`
print(randomLetters[randomIndex])Consiglio: valuta di dare un'occhiata alla libreria random, ti tornerà utile quando programmi in Python!
3. Come trasformare le liste di Python in altre strutture dati
A volte, una lista non è esattamente ciò di cui hai bisogno. In questi casi, potresti voler sapere come trasformare la tua lista in una struttura dati più adatta. Qui sotto elenchiamo alcune delle domande di trasformazione più comuni e le loro risposte.
Come convertire una lista in una stringa
Converti una lista in una stringa usando ''.join(). Questa operazione ti permette di incollare tra loro tutte le stringhe nella tua lista e restituirle come una singola stringa. Leggi di più qui.
# List of Strings to a String
listOfStrings = ['One', 'Two', 'Three']
strOfStrings = ''.join(listOfStrings)
print(strOfStrings)
# List Of Integers to a String
listOfNumbers = [1, 2, 3]
strOfNumbers = ''.join(str(n) for n in listOfNumbers)
print(strOfNumbers)Nota che se la tua lista contiene solo interi, dovresti convertire gli elementi in stringhe prima di fare la join. Questo è illustrato nel secondo esempio nel blocco di codice interattivo qui sopra.
La conversione da intero a stringa è fatta iterando sulla lista originale listOfNumbers. Se vuoi sapere di più su come iterare su una lista, vai alla domanda 12 e alla sua risposta.
Come convertire una lista in una tupla
Puoi trasformare una lista in una tupla in Python usando la funzione tuple(). Passa la tua lista a questa funzione e otterrai una tupla!
Ricorda: le tuple sono immutabili. Non puoi modificarle dopo!
Consiglio: puoi provare a trasformare la tua listOfStrings in una tupla nell'esercizio interattivo della prossima sezione.
Come convertire la tua lista in un set in Python
Come ricorderai, un set è una raccolta non ordinata di elementi unici. Questo significa non solo che eventuali duplicati presenti nella lista originale andranno persi una volta convertita in un set, ma anche l'ordine degli elementi della lista.
Puoi trasformare una lista in un set con la funzione set(). Basta passarle la tua lista!
Ora esercitati a convertire la tua lista listOfStrings in una tupla e in un set qui:
# Pass your list to `tuple()`
tuple(___)
# Transform your list into a set
set(___)Come convertire liste in dizionari
Un dizionario lavora con chiavi e valori, quindi la conversione da lista a dizionario potrebbe essere meno immediata. Diciamo che hai una lista così:
helloWorld = ['hello','world','1','2']
Dovrai assicurarti che 'hello' e 'world' e '1' e '2' siano interpretati come coppie chiave-valore. Il modo per farlo è selezionarli con la notazione di slice e passarli a zip().
zip() funziona come previsto: unisce gli elementi a due a due. In questo caso, quando unisci gli elementi di helloWorld helloWorld[0::2] e helloWorld[1::2], l'output sarà:
list(zip(helloWorld))Nota che devi usare list() per stampare il risultato della funzione zip().
Passerai poi questo risultato alla funzione dict(), che interpreterà hello come chiave e world come valore. Allo stesso modo, 1 sarà interpretato come chiave e 2 come valore.
Esegui il codice qui sotto per confermarlo:
# Convert to a dictionary
helloWorldDictionary = dict(zip(helloWorld[0::2], helloWorld[1::2]))
# Print out the result
print(helloWorldDictionary)Nota che il secondo elemento passato alla funzione zip() usa il valore di step per assicurarsi che vengano selezionati solo gli elementi world e 2. Allo stesso modo, il primo elemento usa lo step per selezionare hello e 1.
Se la tua lista è grande, probabilmente vorrai fare qualcosa del genere:
a = [1, 2, 3, 4, 5]
# Create a list iterator object
i = iter(a)
# Zip and create a dictionary
print(dict(zip(i, i)))Nota che un oggetto iterabile può fornirti un iteratore. L'iteratore, che ha un metodo .__next__, contiene informazioni su dove ti trovi nell'iterazione: sa qual è il prossimo elemento.
4. Come determinare la dimensione della tua lista in Python
Puoi passare la tua lista alla funzione len() per ottenere la lunghezza della lista.
Provalo qui sotto! Abbiamo già creato una lista justAList che puoi usare.
# Pass `justAList` to `len()`
len(____)Nota che la funzione len() non serve specificamente a recuperare la lunghezza delle liste, ma può essere usata anche con altre sequenze o collezioni, come dizionari, set, stringhe, ecc. Puoi trovare altre funzioni integrate generali qui.
5. Qual è la differenza tra i metodi Python append() ed extend()?
Per cominciare a rispondere a questa domanda, riprendiamo il concetto di iterabile spiegato nella prima sezione di questo post:
Ricorda che diciamo che un certo valore è iterabile quando il tuo programma può iterarci sopra. In altre parole, un iterabile è un valore che rappresenta una sequenza di uno o più valori. Come probabilmente hai letto nella prima sezione, le liste sono sequenze e tutte le istanze dei tipi sequenza di Python sono iterabili.
Consiglio: verifichi se una variabile è iterabile quando ha il metodo .__iter__, come in questo frammento di codice:
# This is your list
list = [5, 6, 7, 8, 9]
# Check whether it's iterable
list.__iter__Esegui il codice qui sopra e prova altri semplici esempi nella shell IPython!
Ora che il concetto di iterabile è chiaro, possiamo capire la differenza tra i due metodi. extend(), da una parte, prende un iterabile (già, prende una lista, un set, una tupla o una stringa!) e aggiunge ciascun elemento dell'iterabile alla lista uno alla volta.
append(), dall'altra, aggiunge il suo argomento alla fine della lista come elemento singolo, il che significa che quando la funzione append() riceve un iterabile come argomento, lo tratterà come un singolo oggetto.
Studia i blocchi di codice qui sotto e gioca con il codice per capire le differenze tra questi due metodi:
# Append [4,5] to `shortList`
shortList.append([4, 5])
# Use the print() method to show shortList
print(____)
# Extend `longerList` with [4,5]
longerList.extend([4, 5])
# Use the print() method to see longerList
print(____)Puoi vedere che extend() è una versione più efficiente del chiamare append() più volte.
6. Come concatenare liste in Python
Per concatenare liste, usa l'operatore +. Ti restituirà una nuova lista che è la concatenazione delle due senza modificare quelle originali.
Nota che concatenare e fare append può creare confusione. append() è diverso dall'operatore +, che a sua volta è molto simile al metodo extend(), ma non esattamente uguale... Vedi che con append() ed extend() modifichi la lista originale, mentre con l'operatore + puoi creare un'altra variabile lista.
Provalo tu stesso e confronta con gli esempi del blocco di codice precedente:
# Concatenate `shortList` with `[4,5]`
plusList = shortList + [4,5]
#Use the `print()` method to see `plusList`
print(____)7. Come ordinare una lista in Python
Ci sono due modi molto semplici per ottenere i valori delle liste in ordine crescente o decrescente:
- Usi il metodo
sort() - Oppure usi la funzione
sorted()passandole una lista
La funzione sorted() può essere applicata a qualsiasi oggetto iterabile, il che significa che accetta anche stringhe, set, dizionari quando le vengono passati!
Consiglio: prova tu stesso! Abbiamo già creato due liste, rooms e orders, che puoi ordinare con le due tecniche descritte sopra :)
# Use sort() on the rooms list
____.sort()
# Print out rooms to see the result
print(____)
# Now use the sorted() function on orders
sorted(____)
# Print out orders
print(____)Nota come la lista originale cambia dopo averla ordinata. È consigliabile usare questo metodo quando non ti serve più la lista originale.
8. Come clonare o copiare una lista in Python
Ci sono molti modi per clonare o copiare una lista:
- Puoi fare lo slice della lista originale e memorizzarla in una nuova variabile:
newList = oldList[:] - Puoi usare la funzione integrata
list():newList = list(oldList) - Puoi usare la libreria
copy:- Con il metodo
copy():newList = copy.copy(oldList) - Se la tua lista contiene oggetti e vuoi copiare anche quelli, puoi usare
copy.deepcopy():copy.deepcopy(oldList)
- Con il metodo
Provalo qui sotto! Abbiamo già creato una lista groceries da copiare e condividere con i tuoi amici.
# Copy the grocery list by slicing and store it in the `newGroceries` variable
newGroceries = groceries[__]
# Copy the grocery list with the `list()` function and store it in a `groceriesForFriends` variable
groceriesForFriends = list(____)
# Import the copy library as c
import ____ as __
# Create a `groceriesForFamily` variable and assign the copied grocery list to it
groceriesForFamily = c.copy(____)
# Use `deepcopy()` and assign the copied list to a `groceriesForKids` variable
groceriesForKids= c.deepcopy(____)Nota che quando usi i metodi di copia "semplici", le tue liste originali verranno modificate. Tuttavia, se usi il metodo deepcopy(), questo verrà evitato. Esegui il codice qui sotto per vedere cosa succede:
# This is your list
objectList = ['a','b',['ab','ba']]
# Copy the `objectList`
copiedList = objectList[:]
# Change the first list element of `copiedList`
copiedList[0] = 'c'
# Go to the third element (the nested list) and change the second element
copiedList[2][1] = 'd'
# Print out the original list to see what happened to it
print(objectList)Per chi ha già portato le liste in Python a un livello successivo, la sezione seguente offre risposte semplici a domande complesse.
Per chi invece si chiede cosa ci sia oltre le liste, e quali vantaggi possano offrire le librerie rispetto alla struttura lista integrata, la prossima sezione potrebbe essere molto utile.
Continua a leggere per saperne di più!
9. Come funziona la list comprehension in Python?
La list comprehension è, in sostanza, un modo elegante di costruire le tue liste. La cosa migliore, per chi ama la matematica, è che assomigliano molto alle liste matematiche. Giudica tu stesso:
[x**2 for x in range(10)]Ora, cosa significa? Prendi tutti i numeri da 0 a 10, dove 10 non è incluso, e moltiplichi ciascuno di quei numeri per 2. Esegui il frammento di codice sopra per vedere se il risultato corrisponde alle tue aspettative.
Niente di troppo difficile, vero? Alziamo un po' l'asticella!
Supponiamo che tu voglia creare la stessa lista di prima, ma vuoi moltiplicare solo i numeri divisibili per 2. Anche questo è facile con l'aiuto della list comprehension:
[x**2 for x in range(10) if x%2==0]Aggiungi semplicemente una condizione, indicata da if, alla tua istruzione originale. Se quella condizione risulta VERA, il numero verrà considerato per la moltiplicazione per 2. In questo caso, la nostra condizione è che il numero sia divisibile per 2 (senza resto dall'operazione di divisione).
In senso più generale, puoi anche usare la list comprehension per trasformare le tue liste in altre liste, il che suona un po' più difficile, vero?
Considera il prossimo esempio:
myList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[(lambda x: x*x)(x) for x in myList]In questo esempio, hai già una lista myList che stai trasformando tramite list comprehension: vedi di nuovo for x in myList, per ogni elemento in myList verrà eseguita un'operazione.
Poi vedi che è inclusa (lambda x: x*x). Per semplificare, ti basta sapere che le funzioni lambda sono funzioni anonime costruite a runtime. Considerando che quel frammento può servirti solo da indicazione, puoi ignorarlo e concentrarti su x*x.
Vedi che questa funzione prende un elemento e lo moltiplica per se stesso. È una funzione anonima, quindi devi passarle l'elemento della lista per assicurarti che la funzione lambda lo prenda come input. Ecco perché vedi (lambda x: x*x)(x).
In altre parole, potresti riscrivere l'intera seconda riga del blocco di codice qui sopra così:
f = lambda x: x*x
[f(x) for x in range(10)]
In cui prima definisci la funzione lambda che dice che vuoi moltiplicare un elemento per se stesso, e poi nella seconda riga la applichi all'elemento della lista, così che ogni elemento venga moltiplicato per se stesso.
Nota che oltre alle list comprehension, esistono anche le set e le dictionary comprehension.
È già tanta roba, ma c'è molto altro da scoprire sulla list comprehension.
Continua a leggere le prossime domande frequenti per imparare di più sulle list comprehension annidate e per vedere esempi pratici di cosa possono significare per la tua programmazione in Python!
10. Come contare le occorrenze di un elemento in una lista in Python
Poiché le liste non hanno il criterio di unicità degli elementi, come i set, potresti voler sapere non solo quante volte un particolare elemento compare nella lista, ma anche quante volte compare ciascun elemento.
Qui sotto trovi le risposte a entrambe le domande!
Contare le occorrenze di un solo elemento in una lista
Per contare le occorrenze di un singolo elemento nella lista puoi usare il metodo count():
# Count the occurrences of the number 4
print([1, 2, 9, 4, 5, 4, 1].count(4))
# Count the occurrences of the letter "a"
list = ["d", "a", "t", "a", "c", "a", "m", "p"]
list.count("a")Contare le occorrenze di tutti gli elementi in una lista è noto anche come "tallying" di una lista, o creare un contatore.
Contare tutti gli elementi di una lista con count()
Per contare le occorrenze degli elementi in una lista, puoi anche usare la list comprehension in combinazione con il metodo count():
list= ["a","b","b"]
[[x,list.count(x)] for x in set(list)]In questo codice, prima vedi che la tua lista viene convertita in un set. Questo garantirà che vengano mantenuti solo gli elementi unici della lista, cioè a e b. Poi dici che per ogni elemento del set vuoi prendere quell'elemento e passarlo a un metodo count().
Ricorda che i set contengono solo elementi unici!
In questo caso, prima a verrà passato a list.count(x) e verranno contate tutte le occorrenze di a nella lista originale.
Contare tutti gli elementi della lista con Counter()
In alternativa, c'è il più veloce metodo Counter() dalla libreria collections:
# Import `Counter` from the `collections` library
from collections import Counter
# This is your list
list = ["a","b","b"]
# Pass `list` to `Counter()`
Counter(list)Nota che Counter() è generalmente più veloce quando vuoi contare tutti gli elementi della lista.
11. Come suddividere una lista Python in blocchi di dimensioni uguali
Per suddividere la tua lista in parti della stessa dimensione, puoi ricorrere alla funzione zip() in combinazione con iter():
# Your list `x`
x = [1,2,3,4,5,6,7,8,9]
# Split `x` up in chunks of 3
y = zip(*[iter(x)]*3)
# Use `list()` to print the result of `zip()`
list(y)Il codice sopra funziona così:
iter()è un iteratore su una sequenza.[iter(x)] * 3produce una lista con tre oggettilistiterator: ogni list iterator è un iteratore dix.- l'
*passato alla funzionezip()prima di tutto il resto spacchetta la sequenza in argomenti in modo da passare lo stesso iteratore tre volte azip(), e ogni volta estrae un elemento dall'iteratore.
Aspetta. Quest'ultimo passaggio non è per niente chiaro.
Ti guido passo passo:
- Avrai tre oggetti list iterator, che puoi immaginare così:
[1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9]
- La prima volta,
zip()prenderà un elemento dalla lista in sequenza, il che ti lascia con:
[1][2][3]
Nota che gli oggetti iteratore terranno traccia per te di quale elemento è il prossimo nell'iterazione!
- La seconda volta, gli elementi verranno aggiunti alle tre liste appena create e ti ritroverai con:
[1, 4], [2, 5], [3, 6]
- L'ultima volta, segui la stessa procedura e ottieni:
[1, 4, 7], [2, 5, 8], [3, 6, 9]
- Unendo queste tre liste insieme con zip, rimarrai con:
[1, 2, 3], [4, 5, 6], [7, 8, 9]
Se però decidi di inserire questa logica in una funzione, puoi seguire questo approccio:
# Method to split up your lists into chunks
def chunks(list, chunkSize):
"""Yield successive chunkSize-sized chunks from list."""
for i n range(0, len(list), chunkSize):
yield list[i:i + chunkSize]
# Use your `chunks` function to print out chunks of the same size
import pprint
pprint.print(list(chunks(range(10, 75), 10)))La tua funzione chunks() riceve una lista e una dimensione del blocco come input. Poi stamperà: "Yield successive (la tua dimensione) porzioni dalla lista" (cioè la lista che dai al metodo chunks()).
Poi vedi range(0, len(list), chunkSize): questa lista parte da 0 e termina all'intero che indica la lunghezza della tua lista. Il valore di step è uguale al valore chunkSize che passi a chunks().
Per ogni elemento in questa lista costruita da range(), produci una porzione della lista originale, a partire dall'indice dell'elemento che viene dato e terminando all'indice + la dimensione del blocco fornita.
Per esempio, se l'indice 0 passa attraverso il ciclo for, verrà restituita una lista [0:2]. Nell'iterazione successiva, l'indice 2 passa attraverso il ciclo for (ricorda il valore di step!), e verrà restituita una porzione [2:4] della lista originale.
Nota che usi pprint(), o pretty print, per stampare il risultato.
Puoi anche semplicemente usare la list comprehension invece di scrivere una funzione:
# Set up your list and chunk size
list = range(0, 50)
chunk = 5
# Split up your list into chunks
[list[i:i + chunk] for i in range(0, len(list), chunk)]12. Come iterare su una lista in Python
Puoi facilmente scorrere qualsiasi lista con un for loop. Per chi non ha lavorato molto con i for loop, funziona così: il for loop consente di eseguire un'azione per ogni elemento della lista.
In Python, un for loop è così:
# This is your list
mylist = [[1,2,3],[4,5,6,7],[8,9,10]]
# Loop over your list and print all elements that are of size 3
for x in mylist:
if len(x)==3:
print(x)Hai una lista mylist e dici a Python di verificare se la lunghezza di ogni elemento è uguale a 3. Poiché le nostre liste contengono due liste che hanno tre elementi ciascuna, cioè [1,2,3] e [8, 9,10], verranno stampate solo queste.
Nota come x nel blocco di codice sopra possa essere cambiato in element, listElement o qualsiasi altro nome tu voglia. Provalo in console!
Vedi che il risultato non mostra gli indici degli elementi. Se vuoi iterare su una lista usando l'indice, puoi fare così:
# This is your list
myList = [3,4,5,6]
# Loop over `myList` and print tuples of all indices and values
for i, val in enumerate(myList):
print(i, val)Dal momento che vuoi stampare non solo gli elementi ma anche il loro indice, ovviamente devi mostrarlo nel for loop. Ecco perché usiamo enumerate(myList), che restituirà un indice e un valore. Naturalmente, dobbiamo mostrarlo anche all'inizio della for statement: vedi i, val per chiarire che ci aspettiamo indice e valore come risultato.
Nota che puoi anche usare la list comprehension per iterare su una lista. Qui, i risultati vengono già stampati senza dover passare print():
[x for x in myList if len(x)==3]13. Come creare liste piatte a partire da liste di liste
Per creare una semplice lista da una lista di liste, puoi usare la funzione sum(). Non dimenticare di passarle la tua lista e una lista vuota:
# Your initial list of lists
list = [[1,2],[3,4],[5,6]]
# Flatten out your original list of lists with `sum()`
sum(list, [])Puoi anche usare due diversi approcci per appiattire le tue liste:
# You can reduce the lists of lists of lists like this
from functools import reduce
print(reduce(lambda x,y: x+y,listOfLists))
# Or you can use list comprehension
print([item for sublist in listOfLists for item in sublist])- Usi il metodo
reduce(), a cui passi una funzione lambda. Il metodoreduce()serve a ridurre il tuo iterabile a un singolo valore. Come viene ridotto lo stabilisci con la funzione che gli passi. In questo caso, dici che vuoi sommare gli elementi in modo cumulativo: quello che succede è che[1,2]viene aggiunto a[3,4]e questo risultato viene aggiunto a[5,6]. Rappresentato visivamente, ottieni:
([1,2]+[3,4])+[5,6]
Ricorda che l'operatore + concatena le liste.
- La seconda opzione per creare liste piatte da liste di liste è usare la list comprehension. Questa istruzione con for annidati non è delle più semplici. In sostanza, prima prendi
sublist in listcioè[1, 2],[3, 4],[5, 6]e poi consideriitem for item in sublist, stampando ogni elemento della sottolista.
Un altro modo di vedere questa list comprehension annidata è riscriverla come un normale for loop:
list1 = []
for sublist in list:
for item in sublist:
list1.append(item)
14. Come ottenere l'intersezione di due liste Python
Intersezione di liste usando la list comprehension
Se vuoi ottenere l'intersezione di due liste, puoi usare la funzione filter().
Questo è illustrato nell'esercizio qui sotto. Abbiamo già definito due liste per te, list1 e list2. Usa la shell IPython se vuoi controllare il contenuto delle liste.
# Intersect both lists with list comprehension
intersection = [list(filter(lambda x: x in list1, sublist)) for sublist in list2]
# Print the result of the intersection
print(____)Nel codice sopra, la parte con filter() prende ogni elemento di ciascuna sottolista e verifica se è presente nella lista di origine list1. La list comprehension viene eseguita per ogni sottolista in list2.
Nota che, poiché filter() restituisce un iterabile e non una lista, devi racchiudere tutto ciò che passi a filter() con list(). Prova a rimuovere list() per verificarlo!
Per una migliore leggibilità, puoi anche usare list comprehension annidate:
# An intersection of both lists, stored in `intersection`
intersection = [[x for x in sublist if x in list1] for sublist in list2]
# Print the result of the intersection
print(intersection)Intersecare liste con set()
Se l'ordine dei tuoi elementi non è importante e non ti devi preoccupare dei duplicati, allora puoi usare l'intersezione tra set:
# Make use of the list and set data structures
print(list(set(list1) & set(list2)))
# Use `intersection()`
print(list(set(list1).intersection(list2)))Nel primo esempio, converti entrambe le liste in set, le intersechi e poi converti di nuovo il risultato in lista. L'ordine nella lista in output sarà arbitrario. Puoi anche convertire in set la più grande delle due liste, dopo di che puoi ottenere l'intersezione di quel set con qualsiasi iterabile usando intersection().
Nota che per far funzionare questi due approcci, la tua lista non deve contenere altre liste. Ecco perché list2 appare diversa. Stampala per sicurezza!
15. Come rimuovere i duplicati da una lista in Python
Come descritto nella prima sezione di questo post, è meglio scegliere un set se vuoi memorizzare una raccolta unica di elementi non ordinati.
Per creare un set da un qualsiasi iterabile, puoi semplicemente passarlo alla funzione integrata set(). Se in seguito ti serve di nuovo una vera lista, puoi analogamente passare il set alla funzione list().
Ricorda che un iterabile può essere una lista, un dizionario, ... Verifica se una variabile è un iterabile applicandole il metodo .__iter__.
Il seguente esempio dimostra chiaramente l'uso di set() per eliminare tutti i duplicati dalla tua lista:
# Your list with duplicate values
duplicates = [1, 2, 3, 1, 2, 5, 6, 7, 8]
# Print the unique `duplicates` list
print(list(set(duplicates)))
# A list with small numbers
smallNumbers = [1, 2, 3]
# Print the unique `duplicates` list without the small numbers
list(set(duplicates) - set(smallNumbers))Come vedi dall'ultimo risultato, l'ordine originale della lista non viene mantenuto dopo che sottrai gli elementi del set smallNumbers. Come ormai sai, i set sono collezioni non ordinate, quindi qualsiasi ordine avessi nella lista va perso. Quando converti di nuovo il set in lista, viene creato un ordine arbitrario.
Se l'ordine dei tuoi elementi è importante, allora dovrai usare un meccanismo diverso. Questa pagina tratta l'argomento più nel dettaglio.
16. Perché NumPy invece delle liste Python?
In generale, ci sono quattro motivi per cui i programmatori Python preferiscono gli array NumPy alle liste:
- perché gli array NumPy sono più compatti delle liste.
- perché leggere e scrivere elementi è più veloce con NumPy.
- perché NumPy può essere più comodo da usare, grazie al fatto che ottieni molte operazioni su vettori e matrici gratuitamente
- perché NumPy può essere più efficiente da usare, in quanto implementato in modo più efficiente.
17. Come creare array NumPy vuoti
Se vuoi semplicemente creare un array NumPy vuoto, puoi eseguire quanto segue:
import numpy
numpy.array([])Tuttavia, se il tuo obiettivo è inizializzare un array NumPy, puoi anche seguire uno dei seguenti approcci:
# Make a NumPy array of four rows and two columns and filled with 0
numpy.zeros(shape=(4,2))
# Make a NumPy array of 1 values of three columns
numpy.ones(3)
# Make an empty NumPy array
numpy.empty(shape=(0,0))Assicurati di consultare questa documentazione se cerchi altri modi per inizializzare un array NumPy.
18. Come fare matematica con le liste in Python
Spesso non usiamo le liste solo per memorizzare una raccolta di valori, ma anche per eseguire su di esse alcune operazioni matematiche. Questa sezione copre alcune delle domande più frequenti sul fare matematica con le liste.
Come calcolare la media ponderata di una lista
La media ponderata è simile a una media ma è leggermente diversa: una media ponderata restituisce un numero che dipende sia dai valori sia dai pesi.
Questa definizione può sembrare un po' impegnativa all'inizio. Diamo un'occhiata a un esempio:
cost = [0.424, 0.4221, 0.4185, 0.4132, 0.413]
cases = [10, 20, 30, 40, 50]
Puoi calcolare facilmente la media ponderata con i seguenti frammenti di codice:
for c in range(len(cost)):
cost[c] = (cost[c] * cases[c] / sum(cases))
cost = sum(cost)
print(cost)Ma puoi anche scegliere uno di questi altri due approcci. Per prima cosa, puoi usare:
sum(cost[c] * cases[c] / sum(cases) for c in range(len(cost)))Oppure puoi usare questo:
sum(cost[c] * cases[c] for c in range(len(cost))) / sum(cases)Infine, puoi anche calcolare la media ponderata della tua lista con l'aiuto della funzione zip().
Consiglio: crea una variabile costAndCases a cui assegni semplicemente la funzione zip(), con le variabili cost e case passate. Vedrai come viene creata un'altra lista contenente solo tuple. Il primo valore di ogni tupla rappresenta il costo, mentre il secondo rappresenta i casi acquistabili a quel prezzo.
# See what `zip()` does to your `cost` and `cases`
print(list(zip(____, ____)))
# Calculate the weighted average
print(sum([x * y for x, y in zip(cost, cases)]) / sum(cases))Ricorda cosa fa zip() con le tue liste? Semplice, le "zippa" insieme, letteralmente. Ad esempio, zip(cost, cases) produce [(0.424, 10), (0.4221, 20), (0.4185, 30), (0.4132, 40), (0.413, 50)].
Come calcolare il quantile di una lista in Python
I quantili sono essenziali per riassumere il tuo dataset, insieme al minimo e al massimo del set. Hai anche il 25°, 50° e 75° percentile, chiamati anche primo quartile, mediana e terzo quartile.
Ciò significa che, in totale, ti servono cinque numeri per riassumere l'intero dataset: minimo, massimo, mediana e i due quartili.
Il minimo e il massimo del dataset sono facili da trovare, ma che dire di quei percentili?
È facile. Diciamo che nel tuo dataset hai 25 istanze ordinate dal valore più basso al più alto:
- Il 25° percentile o primo quartile si calcola moltiplicando 0,25 per 25. Il numero risultante, 6,25 o 7 se arrotondiamo per eccesso, ti indica quale numero è il 25° percentile: la 7ª istanza nella lista ordinata.
- Il terzo quartile o 75° percentile si calcola moltiplicando 0,75 per 25. Il numero risultante, 18,75, cioè 19 se arrotondi, ti dice che la 19ª istanza nella lista ordinata è il terzo percentile.
- La mediana del dataset si calcola moltiplicando 0,5 per 25. Il 13° numero sarà la mediana, dato che arrotondi 12,5.
Ma come programmi tutto questo per la tua lista?
Il modo più semplice è lavorare con NumPy. Segui le istruzioni nell'esercizio interattivo qui sotto per calcolare i percentili della tua lista:
# Import numpy as np
import ____ as __
# Make a NumPy array
a = np.array([1,2,3,4,5])
# Return the 50th percentile of our NumPy array
p = np.percentile(a, 50)
#Print the result
print(____)Come sommare le liste elemento per elemento
Supponiamo che tu abbia due liste:
list1=[1, 2, 3]
list2=[4, 5, 6]
E vuoi assicurarti di sommare gli elementi delle liste elemento per elemento; cioè che 1 si sommi a 4, 2 a 5 e 3 a 6. Hai due modi per farlo.
Continua a leggere per saperne di più!
... Con Python di base
Puoi usare map con operator.add per eseguire un'addizione elemento per elemento:
from operator import add
list(map(add, list1, list2))Questo produrrà la lista [5, 7, 9].
Nota che dovrai usare list() per stampare il risultato della funzione map().
Oppure puoi usare la funzione zip() con una list comprehension:
[sum(x) for x in zip(list1, list2)]... Con NumPy
Gli esempi precedenti funzionano perfettamente su queste piccole liste, ma quando lavori con un po' più di dati, probabilmente dovresti usare numpy per semplificare il processo.
Devi assicurarti di importare la libreria numpy e che le tue liste siano convertite in array NumPy:
Cosa ti aspetta dopo nel tuo percorso di Data Science con Python?
Sei arrivato alla fine del nostro tutorial interattivo sulle liste in Python. È stato parecchio da assimilare e un bel po' di lavoro, ma ce l'hai fatta!
Le liste sono solo un piccolo ma essenziale elemento nel tuo percorso di data science con Python. C'è molto di più da esplorare! Il nostro corso interattivo Introduzione a Python per la Data Science è perfetto per chi vuole imparare di più su Python e su come viene usato nella data science: partirà dalle basi di Python per portarti gradualmente e con delicatezza a un livello intermedio introducendoti a NumPy. Perfetto per chi ha poca esperienza nella programmazione (in Python)!
Se invece sei già un utente Python più avanzato, potresti valutare il nostro corso Python intermedio per la Data Science, pensato per chi è pronto a portare al livello successivo le proprie competenze in data science e Python. Questo corso ti porterà sicuramente ancora più avanti nel tuo apprendimento: ti introduce a più librerie, come matplotlib e pandas, a concetti come logica, flusso di controllo e filtraggio, e include uno studio di caso di data science per consolidare le tue abilità.
Stai già usando Python per la data science ma vuoi spingerti ancora oltre? Potresti essere interessato al nostro corso Importare dati in Python o leggere la nostra serie di tutorial L'importanza del preprocessing nella data science e nella pipeline di machine learning!
Il post offrirà soluzioni semplici, spiegazioni facili da seguire e lineari e alcuni trucchi che puoi mettere subito in pratica con l'aiuto di esercizi interattivi!