Liste 4 - Metodi di ricerca
Scarica zip esercizi
Le liste mettono a disposizione diversi metodi per effettuare ricerche e trasformazioni al loro interno, ma attenzione: il potere è nulla senza il controllo! Spesso ti troverai con l’esigenza di usarli, e potrebbero anche funzionare con qualche piccolo esempio, ma molto spesso nascondono tranelli che poi si rimpiangono amaramente. Quindi quando scrivi codice con uno di questi metodi, poniti sempre le domande che evidenzieremo!
Metodo |
Ritorna |
Descrizione |
---|---|---|
str1.split(str2) |
|
Produce una lista con tutte le parole in str1 separate da str2 |
|
Conta le occorrenze di un elemento |
|
|
Trova la prima occorrenza di un elemento e ne ritorna la posizione |
|
|
Rimuove la prima occorrenza di un elemento |
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
lists
lists1.ipynb
lists1-sol.ipynb
lists2.ipynb
lists2-sol.ipynb
lists3.ipynb
lists3-sol.ipynb
lists4.ipynb
lists4-sol.ipynb
lists5-chal.ipynb
jupman.py
ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.
apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook
lists4.ipynb
Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.
Scorciatoie da tastiera:
Per eseguire il codice Python dentro una cella di Jupyter, premi
Control+Invio
Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+Invio
Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+Invio
Se per caso il Notebook sembra inchiodato, prova a selezionare
Kernel -> Restart
Metodo split - da stringhe a liste
Il metodo split
delle stringhe fa l’opposto di join
: viene chiamato su una stringa e come parametro viene passato un separatore, che può essere un singolo carattere o una sottostringa. Il risultato è una lista di stringhe senza il separatore.
[2]:
"E' giunto il momento di dividere il tesoro".split("il")
[2]:
["E' giunto ", ' momento di dividere ', ' tesoro']
Chiamando split
senza argomenti come separatori vengono usati in genere i blank (spazio, a capo \n
, tab \t
, etc)
[3]:
s = "E' giunto il\nmomento di dividere\til tesoro"
print(s)
E' giunto il
momento di dividere il tesoro
[4]:
s.split()
[4]:
["E'", 'giunto', 'il', 'momento', 'di', 'dividere', 'il', 'tesoro']
E’ anche possibile limitare il numero di elementi da dividere specificando l’argomento maxsplit
:
[5]:
s.split(maxsplit=2)
[5]:
["E'", 'giunto', 'il\nmomento di dividere\til tesoro']
ATTENZIONE: Che succede se la stringa non contiene il separatore? Ricordati di considerare anche questo caso!
[6]:
"Parlo e straparlo senza mai fare una pausa".split(',')
[6]:
['Parlo e straparlo senza mai fare una pausa']
DOMANDA: Guarda questo codice. Stamperà qualcosa alla fine? O produrrà un errore?
"porta\tgirevole".split()
"porre particolare\t\nattenzione".split()
"non ti\tscordar\ndi\tme".split('\t')
"non ti scordar\ndi\tme".split(' ')
"Il Guardiano dell'Abisso ci osservava minaccioso".split('abisso')[1]
"".split('abisso')[0]
"abisso_OOOO_abisso".split('abisso')[0]
Esercizio - trash dance
Ti hanno ingaggiato per ballare nell’ultimo video della nota band Spazzatura Melodica. Non puoi perdere questa occasione e ti lanci a leggere la partitura, ma la trovi piena di errori (gli Spazzatura non hanno certo bisogno di saper scrivere spartiti per andare in tv). Ci sono strani simboli e l’ultima battuta è troppo lunga (dopo la sesta battuta) e va messa una riga alla volta. Scrivi del codice che sistema la partitura in una lista dance
Esempio - data:
musica = "Zam Dam\tZa Bum Bum\tZam\tBam To Tum\tRa Ta Pam\tBar Ra\tRammaGumma Unza\n\t\nTACAUACA \n BOOMBOOM!"
dopo il tuo codice deve risultare:
>>> print(dance)
['Zam Dam',
'Za Bum Bum',
'Zam',
'Bam To Tum',
'Ra Ta Pam',
'Bar Ra',
'RammaGumma',
'Unza',
'TACAUACA',
'BOOMBOOM!']
[7]:
musica = "Zam Dam\tZa Bum Bum\tZam\tBam To Tum\tRa Ta Pam\tBar Ra\tRammaGumma Unza\n\t\nTACAUACA \n BOOMBOOM!"
# scrivi qui
Esercizio - spazzatura In tour
Gli Spazzatura Melodica tornano a colpire nel nuovo tour dove presentano le hit dell’estate. La casa discografica fornisce però le vendite con numeri in formato anglosassone, e per comunicarle ai media italiani è necessaria prima una conversione.
Scrivi del codice che date le hits
e una posizione
nella classifica (da 1
a 4
) mostra il numero di copie vendute
NOTA: le virgole devono essere sostituite con punti
Esempio - dati:
hits = """6,230,650 - Ti amo come i pomodori ammuffiti nel frigorifero
2,000,123 - Il dolore di vivere pieni di soldi
100,000 - Le groupies non sono mai abbastanza
837 - Ti ricordi i cassonetti l'estate..."""
posizione = 1 # i pomodori
#posizione = 4 # i cassonetti
Stampa:
La numero 1 in classifica "Ti amo come i pomodori ammuffiti nel frigorifero" ha venduto 6.230.650 copie
[8]:
hits = """6,230,650 - Ti amo come i pomodori ammuffiti nel frigorifero
2,000,123 - Il dolore di vivere pieni di soldi
100,000 - Le groupies non sono mai abbastanza
837 - Ti ricordi i cassonetti l'estate..."""
posizione = 1 # i pomodori
#posizione = 4 # i cassonetti
# scrivi qui
Esercizio - moltelinee
Dato la seguente stringa di testo:
"""Questa è una stringa
di testo su
diverse linee che non dice niente. """
stampala
stampa quante linee, parole e caratteri contiene
metti in ordine alfabetico le parole e stampale le prime e ultime in ordine lessicografico
Dovresti ottenere:
Questa è una stringa
di testo su
diverse linee che non dice niente.
Linee: 3 parole: 13 charatteri: 67
['Q', 'u', 'e', 's', 't', 'a', ' ', 'è', ' ', 'u', 'n', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', 'a', '\n', 'd', 'i', ' ', 't', 'e', 's', 't', 'o', ' ', 's', 'u', '\n', 'd', 'i', 'v', 'e', 'r', 's', 'e', ' ', 'l', 'i', 'n', 'e', 'e', ' ', 'c', 'h', 'e', ' ', 'n', 'o', 'n', ' ', 'd', 'i', 'c', 'e', ' ', 'n', 'i', 'e', 'n', 't', 'e', '.']
67
Prima parola : Questa
Ultima parola: è
['Questa', 'che', 'di', 'dice', 'diverse', 'linee', 'niente.', 'non', 'stringa', 'su', 'testo', 'una', 'è']
[9]:
s = """Questa è una stringa
di testo su
diverse linee che non dice niente."""
# scrivi qui
Esercizio - prendilettere
✪ Data una frase
che contiene esattamente 3 parole e ha sempre come parola centrale un numero \(n\), scrivi del codice the STAMPA i primi \(n\) caratteri della terza parola
Esempio - data:
frase = "Prendi 4 lettere"
il tuo codice deve stampare:
lett
[10]:
frase = "Prendi 4 lettere" # lett
#frase = "Prendere 5 caratteri" # carat
#frase = "Take 10 characters" # characters
# scrivi qui
Metodo count
Si può ottenere il numero di occorrenze di un certo elemento in una lista usando il metodo count
.
[11]:
la = ['c', 'o', 'r', 'r', 'o', 'b', 'o', 'r', 'a', 'r', 'e']
[12]:
la.count('c')
[12]:
1
[13]:
la.count('o')
[13]:
3
[14]:
la.count('r')
[14]:
4
Non abusare count
ATTENZIONE: count
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la lista potrebbe contenere duplicati? Ricordati che verranno tutti conteggiati!
la lista potrebbe non contenere l’oggetto da contare? Ricordati di gestire anche questo caso!
count
compie una ricerca in tutta la lista, che può essere inefficiente: è proprio necessaria, o sappiamo già l’intervallo in cui cercare?
DOMANDA: Guarda i frammenti di codice seguenti, e per ciascuno cerca di indovinare che risultato produce (o se risulta in un errore).
['A','aa','a','aaAah',"a", "aaaa"[1], " a "].count("a")
["il", "castigo", "degli", "stolti"].count('Stolti') == 1
lista = ['oasi','dattero','oasi','cocco','dattero','cocco'] print(lista.count('dattero') == 1)
lista = ['oasi','dattero','oasi','cocco','dattero','cocco'] print(lista[4] == 'dattero')
['2',2,"2",2,float("2"),2.0, 4/2,"1+1",int('3')-float('1')].count(2)
[].count([])
[[],[],[]].count([])
Esercizio - vita di campagna
Data una lista campagna
, scrivi del codice che stampa True
se la prima metà contiene un numero di elementi el1
uguale al numero di elementi el2
nella seconda metà.
[15]:
el1,el2 = 'badili', 'zappe' # True
#el1,el2 = 'badili', 'badili' # False
#el1,el2 = 'cariole', 'aratri' # True
#el1,el2 = 'badili', 'cariole' # False
campagna = ['aratri','cariole', 'badili', 'cariole', 'badili','zappe', 'cariole',
'zappe', 'aratri', 'cariole', 'aratri', 'badili','aratri','zappe']
# scrivi qui
Metodo index
Il metodo index
ci permette di trovare l’indice della PRIMA occorrenza di un elemento.
[16]:
# 0 1 2 3 4
la = ['p','a','e','s','e']
[17]:
la.index('p')
[17]:
0
[18]:
la.index('a')
[18]:
1
[19]:
la.index('e') # troviamo la PRIMA occorrenza
[19]:
2
Se l’elemento che cerchiamo non è presente, otterremo un errore:
>>> la.index('z')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-303-32d9c064ebe0> in <module>
----> 1 la.index('z')
ValueError: 'z' is not in list
Opzionalmente, puoi specificare un indice da dove iniziare a cercare (incluso):
[20]:
# 0 1 2 3 4 5 6 7 8 9 10
['a','c','c','a','p','a','r','r','a','r','e'].index('a',6)
[20]:
8
E anche dove finire (escluso):
# 0 1 2 3 4 5 6 7 8 9 10
['a','c','c','a','p','a','r','r','a','r','e'].index('a',6,8)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-17-7f344c26b62e> in <module>
1 # 0 1 2 3 4 5 6 7 8 9 10
----> 2 ['a','c','c','a','p','a','r','r','a','r','e'].index('a',6,8)
ValueError: 'a' is not in list
Non abusare index
ATTENZIONE: index
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la lista su cui operare potrebbe contenere duplicati? Ricordati che solo il primo verrà trovato!
la lista potrebbe non contenere l’elemento cercato? Ricordati che in questo caso il programma lancerà un errore!
index
compie una ricerca in tutta la lista, che può essere inefficiente: è proprio necessaria, o sappiamo già l’intervallo in cui cercare?se vogliamo sapere se un
elemento
è in una posizione nota a priori (es3
),index
non ci serve, basta scriverelista[3] == elemento
. Usandoindex
potrebbe trovare caratteri duplicati che stanno prima o dopo di quello che vogliamo verificare!
DOMANDA: Guarda i frammenti di codice seguenti, e per ciascuno cerca di indovinare che risultato produce (o se risulta in un errore).
['arco','barca','conca','duna'].index('conca') == ['arco','barca','conca','duna'].index('conca',1)
['azzurro','blu','celeste','puffo'][-1:].index('celeste')
strada = ['asfalto','bitume','cemento','ghiaia'] print('malta' in strada or strada.index('malta'))
strada = ['asfalto','bitume','cemento','ghiaia'] print('malta' in strada and strada.index('malta'))
strada = ['asfalto','bitume','malta','ghiaia'] print('malta' in strada and strada.index('malta'))
la = [0,5,10] la.reverse() print(la.index(5) > la.index(10))
Esercizio - Spatoč
In passato hai avuto conosciuto il pittore slavo Spatoč quando era ancora povero in canna. Ti ha regalato 2 o 3 quadri (non ricordi) dal dubbio valore artistico che hai nascosto in soffitta, ma dalla TV apprendi che Spatoč è diventato un artista di fama internazionale. Corri quindi in soffitta a recuperare i quadri, persi tra le mille cianfrusaglie. Ogni quadro è contenuto in uno [ ]
scatolone, ma non sai in quale scaffale. Scrivi del codice che stampa dove sono.
gli scaffali sono numerati da 1. Se il terzo quadro non è trovato, stampa
0
.NON usare cicli nè
if
SUGGERIMENTO: stampare i primi due (che ci sono sempre) è facile, mentre per l’ultimo riguardati Booleani - ordine di valutazione
Esempio 1 - data:
[21]:
# 1 2 3 4 5
soffitta = [3, '\\', ['quadro'], '---', ['quadro'],
# 6 7 8 9 10
5.23, ['viti'], ['pattini'], ['quadro'], ['lampada']]
il tuo codice deve stampare:
scaffale primo quadro: 3
scaffale secondo quadro: 5
scaffale terzo quadro: 9
Esempio 2 - data:
[22]:
# 1 2 3 4 5 6 7
soffitta = [['quadro'], '--', ['pattini'], ['quadro'], ['statua'], ['viti'], ['stivali']]
il tuo codice deve stampare:
scaffale primo quadro: 1
scaffale secondo quadro: 4
scaffale terzo quadro: 0
[23]:
# 1 2 3 4 5 6 7 8 9 10
soffitta = [3,'\\', ['quadro'], '---', ['quadro'], 5.23, ['viti'], ['pattini'], ['quadro'], ['lampada']]
# 3,5,9
# 1 2 3 4 5 6 7
#soffitta = [['quadro'], '--', ['pattini'], ['quadro'], ['statua'], ['viti'], ['stivali']]
# 1,4,0
# scrivi qui
Metodo remove
remove
prende come parametro un oggetto, cerca la PRIMA cella che contiene quell’oggetto e la elimina:
[24]:
# 0 1 2 3 4 5
la = [6,7,9,5,9,8] # il 9 è alla cella con indice 2 e 4
[25]:
la.remove(9) # cerca la prima cella contenente il numero 9
[26]:
la
[26]:
[6, 7, 5, 9, 8]
Come si può vedere, la cella che era all’indice 2
e che conteneva la PRIMA occorrenza di 9
è stata eliminata. La cella contenente la SECONDA occorrenza di 9
invece è ancora lì.
Se si cerca di rimuovere un oggetto non presente, si riceve un errore:
la.remove(666)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-121-5d04a71f9d33> in <module>
----> 1 la.remove(666)
ValueError: list.remove(x): x not in list
Non abusare remove
ATTENZIONE: remove
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la lista potrebbe contenere duplicati? Ricordati che verrà rimosso solo il primo!
la lista potrebbe non contenere l’oggetto cercato? Ricordati di gestire anche questo caso!
remove
compie una ricerca in tutta la lista, che può essere inefficiente: è proprio necessaria, o sappiamo già la posizionei
dove è presente l’elemento da rimuovere? In tal caso conviene usare.pop(i)
DOMANDA: Guarda i frammenti di codice seguenti, e per ciascuno cerca di indovinare che risultato produce (o se risulta in un errore).
la = ['a','b','c','b'] la.remove('b') print(la)
la = ['a','b','c','b'] x = la.remove('b') print(x) print(la)
la = ['a','d','c','d'] la.remove('b') print(la)
la = ['a','bb','c','bbb'] la.remove('b') print(la)
la = ['a','b','c','b'] la.remove('B') print(la)
la = ['a',9,'99',9,'c',str(9),'999'] la.remove("9") print(la)
la = ['nun', 'me', 'fregà'] la.remove('nun').remove('me').remove('fregà') print(la)
la = ['nun', 'me', 'fregà'] la.remove('nun') la.remove('me') la.remove('fregà') print(la)
la = [4,5,7,10] 11 in la or la.remove(11) print(la)
la = [4,5,7,10] 11 in la and la.remove(11) print(la)
la = [4,5,7,10] 5 in la and la.remove(5) print(la)
la = [9, [9], [[9]], [[[9]]] ] la.remove([9]) print(la)
la = [9, [9], [[9]], [[[9]]] ] la.remove([[9]]) print(la)
Esercizio - nob
Scrivi del codice che rimuove dalla lista la
tutti i numeri contenuti nella lista di 3 elementi lb
il tuo codice deve funzionare con qualsiasi lista
la
elb
di 3 elementipuoi assumere che
la
contenga esattamente DUE occorrenze di tutti gli elementi dilb
(più eventuali altri numeri)
Esempio - dati:
lb = [8,7,4]
la = [7,8,11,8,7,4,5,4]
dopo il tuo codice deve risultare
>>> print(la)
[11, 5]
[27]:
lb = [8,7,4]
la = [7,8,11,8,7,4,5,4]
# scrivi qui
Prosegui
Continua con le prime challenge
[ ]: