Liste 4 - Metodi di ricerca

Scarica zip esercizi

Naviga file online

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)

list

Produce una lista con tutte le parole in str1 separate da str2

list.count(obj)

int

Conta le occorrenze di un elemento

list.index(obj)

int

Trova la prima occorrenza di un elemento e ne ritorna la posizione

list.remove(obj)

None

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?

  1. "porta\tgirevole".split()
    
  2. "porre particolare\t\nattenzione".split()
    
  3. "non ti\tscordar\ndi\tme".split('\t')
    
  4. "non ti scordar\ndi\tme".split(' ')
    
  5. "Il Guardiano dell'Abisso ci osservava minaccioso".split('abisso')[1]
    
  6. "".split('abisso')[0]
    
  7. "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!']
Mostra soluzione
[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
Mostra soluzione
[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. """
  1. stampala

  2. stampa quante linee, parole e caratteri contiene

  3. 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', 'è']
Mostra soluzione
[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
Mostra soluzione
[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:

  1. la lista potrebbe contenere duplicati? Ricordati che verranno tutti conteggiati!

  2. la lista potrebbe non contenere l’oggetto da contare? Ricordati di gestire anche questo caso!

  3. 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).

  1. ['A','aa','a','aaAah',"a", "aaaa"[1], " a "].count("a")
    
  2. ["il", "castigo", "degli", "stolti"].count('Stolti') == 1
    
  3. lista = ['oasi','dattero','oasi','cocco','dattero','cocco']
    print(lista.count('dattero') == 1)
    
  4. lista = ['oasi','dattero','oasi','cocco','dattero','cocco']
    print(lista[4] == 'dattero')
    
  5. ['2',2,"2",2,float("2"),2.0, 4/2,"1+1",int('3')-float('1')].count(2)
    
  6. [].count([])
    
  7. [[],[],[]].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à.

Mostra soluzione
[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:

  1. la lista su cui operare potrebbe contenere duplicati? Ricordati che solo il primo verrà trovato!

  2. la lista potrebbe non contenere l’elemento cercato? Ricordati che in questo caso il programma lancerà un errore!

  3. index compie una ricerca in tutta la lista, che può essere inefficiente: è proprio necessaria, o sappiamo già l’intervallo in cui cercare?

  4. se vogliamo sapere se un elemento è in una posizione nota a priori (es 3), index non ci serve, basta scrivere lista[3] == elemento. Usando index 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).

  1. ['arco','barca','conca','duna'].index('conca') == ['arco','barca','conca','duna'].index('conca',1)
    
  2. ['azzurro','blu','celeste','puffo'][-1:].index('celeste')
    
  3. strada = ['asfalto','bitume','cemento','ghiaia']
    print('malta' in strada or strada.index('malta'))
    
  4. strada = ['asfalto','bitume','cemento','ghiaia']
    print('malta' in strada and strada.index('malta'))
    
  5. strada = ['asfalto','bitume','malta','ghiaia']
    print('malta' in strada and strada.index('malta'))
    
  6. 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
Mostra soluzione
[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:

  1. la lista potrebbe contenere duplicati? Ricordati che verrà rimosso solo il primo!

  2. la lista potrebbe non contenere l’oggetto cercato? Ricordati di gestire anche questo caso!

  3. remove compie una ricerca in tutta la lista, che può essere inefficiente: è proprio necessaria, o sappiamo già la posizione i 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).

  1. la = ['a','b','c','b']
    la.remove('b')
    print(la)
    
  2. la = ['a','b','c','b']
    x = la.remove('b')
    print(x)
    print(la)
    
  3. la = ['a','d','c','d']
    la.remove('b')
    print(la)
    
  4. la = ['a','bb','c','bbb']
    la.remove('b')
    print(la)
    
  5. la = ['a','b','c','b']
    la.remove('B')
    print(la)
    
  6. la = ['a',9,'99',9,'c',str(9),'999']
    la.remove("9")
    print(la)
    
  7. la = ['nun', 'me', 'fregà']
    la.remove('nun').remove('me').remove('fregà')
    print(la)
    
  8. la = ['nun', 'me', 'fregà']
    la.remove('nun')
    la.remove('me')
    la.remove('fregà')
    print(la)
    
  9. la = [4,5,7,10]
    11 in la or la.remove(11)
    print(la)
    
  10. la = [4,5,7,10]
    11 in la and la.remove(11)
    print(la)
    
  11. la = [4,5,7,10]
    5 in la and la.remove(5)
    print(la)
    
  12. la = [9, [9], [[9]], [[[9]]] ]
    la.remove([9])
    print(la)
    
  13. 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 e lb di 3 elementi

  • puoi assumere che la contenga esattamente DUE occorrenze di tutti gli elementi di lb (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]
Mostra soluzione
[27]:

lb = [8,7,4] la = [7,8,11,8,7,4,5,4] # scrivi qui

Prosegui

Continua con le prime challenge

[ ]: