Stringhe 2

Operatori

Slide adattate da softpython

Premi esc per l'overview generale

1. Operatori 1

Operatori

Operatore Uso Risultato Significato
len len(str) int Ritorna la lunghezza della stringa
concatenazione str + str str Concatena due stringhe
inclusione str in str bool Controlla se la stringa è presente in un'altra stringa
indice str[int] str Legge il carattere all'indice specificato
slice str[int:int] str Estrae una sotto-stringa
uguaglianza ==,!= bool Controlla se due stringhe sono uguali o differenti
replicazione str * int str Replica la stringa

2. Caratteri 1

Leggere caratteri

  • Stringa: sequenza di caratteri
  • Per accedere ad un certo carattere: stringa[pos]
  • NOTA: le posizioni dei caratteri nelle stringhe iniziano da 0

2. Caratteri 2

Leggere caratteri

  • Andare oltre l'ultimo carattere porta ad un errore

2. Caratteri 3

Leggere caratteri

  • Possiamo anche utilizzare lo stesso operatore su variabili

2. Caratteri 4

Leggere caratteri

  • Qual è il tipo del carattere di una stringa?
  • E' a sua volta una stringa!

2. Caratteri 5

Domanda

Data una qualsiasi stringa x, eseguendo

x[0]

otterremmo:

  1. sempre un carattere
  2. sempre un errore
  3. a volte un carattere, a volte un errore a seconda della stringa

2. Caratteri 6

Domanda

Data una qualsiasi stringa x, eseguendo

x[len(x)]

otterremmo:

  1. sempre un carattere
  2. sempre un errore
  3. a volte un carattere, a volte un errore a seconda della stringa

2. Caratteri 7

Esercizio

Date due stringhe che hanno entrambe lunghezza 3, stampa una stringa che intercala caratteri da entrambe le stringhe.

Il tuo codice deve poter funzionare con qualsiasi stringa di questa lunghezza

Esempio: dati

x="say"
y="hi!"

dovrebbe stampare

shaiy!

3. Indici Negativi 1

Indici negativi

  • In Python possiamo anche usare indici negativi, che invece di partire dall'inizio partono dalla fine

3. Indici Negativi 2

Indici negativi

  • Anche in questo caso, andare oltre il limite porta ad un errore

3. Indici Negativi 3

Domanda

Data una stringa x NON vuota, eseguendo

x[-len(x)]

otterremmo:

  1. sempre un carattere
  2. sempre un errore
  3. a volte un carattere, a volte un errore a seconda della stringa

3. Indici Negativi 4

Domanda

Data una qualsiasi stringa x, le espressioni

x[len(x) - 1]

x[-len(x) - 1]

sono equivalenti? Cosa fanno?

3. Indici Negativi 5

Domanda

Data una stringa x NON vuota, cosa produce la seguente espressione?

Possiamo semplificarla?

(x + x)[len(x)]

3. Indici Negativi 6

Domanda

Data una stringa x NON vuota, cosa produce la seguente espressione? Un errore? Altro?

Possiamo semplificarla?

'ciao'[0][0]

3. Indici Negativi 7

Domanda

Data una stringa x NON vuota, cosa produce la seguente espressione? Un errore? Altro?

Possiamo semplificarla?

(x[0])[0]

4. Sostituire caratteri 1

Sostituire caratteri

  • le stringhe sono immutabili
  • Se vogliamo cambiare il carattere in posizione 2 come facciamo?
  • La soluzione proposta non funziona...

4. Sostituire caratteri 2

Sostituire caratteri

Soluzione corretta:

  • assegnare a x una stringa completamente nuova
  • prendere pezzi della precedente
  • Codice equivalente:
x = "ciao"
y = x
x = y[0] + y[1] + 'b' + y[3]

5. Slice 1

Slice

Scrivendo "mercantile"[3:8]

  • Python genera una NUOVA stringa "canti"
  • a partire dall'indice 3 INCLUSO
  • fino all'indice 8 ESCLUSO
  • La stringa originale NON viene modificata!

5. Slice 2

Domanda

Se x è una stringa qualsiasi di lunghezza almeno 5, cosa fa questo codice?

Dà errore? Funziona? Possiamo abbreviarlo?

x[3:4]

5. Slice 3

Esercizio - garalampog

Scrivi del codice per estrarre e stampare alam dalla stringa "garalampog". Prova a indovinare correttamente gli indici.

5. Slice 4

Esercizio - ifEEfav lkD lkWe

Scrivi del codice per estrarre e stampare kS dalla stringa "ifE\te\nfav lkD lkWe"

Fai attenzione agli spazi e caratteri speciali (prima potresti voler stampare x)

Prova a indovinare gli indici corretti

5. Slice 5

Slice - limiti

  • Attenzione ai limiti degli indici
  • NOTA: se andiamo oltre la lunghezza della stringa Python non si arrabbia

5. Slice 6

Domanda

Se x è una stringa qualsiasi (anche vuota), questa espressione cosa fa? Può dare errore? O ritorna qualcosa di utile?

x[0:len(x)]

5. Slice 7

Slice - omissione limiti

  • Omettere indice di partenza: vale come 0
  • Omettere indice di fine: estrae fino alla fine
  • Omettere entrambi: otteniamo l'intera stringa

5. Slice 8

Esercizio - isteroister

Scrivi del codice che data una stringa x ne produce un altra così:

  • con tutti i caratteri eccetto il primo, seguiti da tutti i caratteri eccetto l'ultimo
  • il tuo codice deve funzionare con qualunque stringa

    Esempio: dato x = "mistero" deve stampare isteromister

    Esempio: dato x = "corale" deve stampare oralecoral

5. Slice 9

Slice - limiti negativi

E' anche possibile impostare limiti negativi

Vediamo cosa succede con indici negativi

5. Slice 10

Esercizio - javarnanda

Data una stringa x, scrivi del codice per estrarre e stampare i suoi ultimi 3 caratteri e unirli ai primi 3.

  • Il tuo codice deve funzionare per qualsiasi stringa di lunghezza uguale o superiore a 3

Esempio: dato x = "javarnanda" deve stampare javnda

Esempio: dato x = "bang" deve stampare banang

5. Slice 11

Slice - modifica

  • Supponiamo di voler cambiare la parola tavolo con divano
  • Tentazione: ridefinire sequenza di caratteri corrispondente a "tavolo"...
  • Errore! Le stringhe sono IMMUTABILI

5. Slice 12

Slice - modifica

  • Modo corretto:
    1. Costruire NUOVA stringa da pezzi della stringa originale
    2. Concatenare i caratteri desiderati
    3. Associare risultato alla variabile

5. Slice 13

Esercizio - la corsa

Scrivere del codice per cui data una stringa s

s = "la corsa all'oro è iniziata."

e delle variabili

cosa = "atomo"
verbo = "finita"

sostituisce la sottostringa in corrispondenza di "oro" con la stringa presente nella variabile cosa e sostituisce la sottostringa in corrispondenza di "iniziata" con la stringa presente nella variabile verbo.

Dopo l'esecuzione del tuo codice, print(s) dovrà stampare:

la corsa all'atomo è finita

  • NON usare caratteri costanti nel tuo codice, quindi niente punto '.'

6. Operatore in 1

Operatore in

  • Per verificare se una stringa è contenuta in un’altra, possiamo usare l’operatore in
  • Il risultato di questa espressione è un booleano

6. Operatore in 2

Attenzione!

NON abusare dell'operatore in

6. Operatore in 3

Esercizio - contenute 1

Ti vengono date due stringhe x e y, e una terza z.

Scrivi del codice che stampa True se x e y sono entrambe contenute in z.

Esempio 1: date

x = 'cad'
y = 'ra'
z = 'abracadabra'

dovrebbe stampare True

Esempio 2: date

x = 'zam'
y = 'ra'
z = 'abracadabra'

dovrebbe stampare False

6. Operatore in 5

Esercizio - contenute 2

Date tre stringhe x, y, z, scrivi del codice che:

  • stampa True se una stringa x è contenuta almeno in una delle stringhe y o z, altrimenti stampa False
  • il tuo codice deve funzionare con qualunque insieme di stringhe

Esempio 1: dati

x = 'tti'
y = 'patti chiari amicizia lunga'
z = 'tutto chiaro?'

dovrebbe stampare True

Esempio 2: dati

x = 'zio'
y = 'patti chiari amicizia lunga'
z = 'tutto chiaro?'

dovrebbe stampare False

Esempio 3: dati

x = 'chiaro'
y = 'patti chiari amicizia lunga'
z = 'tutto chiaro?'

dovrebbe stampare True

7. Comparazioni 1

Comparazioni - uguaglianza

  • L'operatore == produce un booleano
  • ATTENZIONE: si scrive con due uguali!

7. Comparazioni 2

Comparazioni - disuguaglianza

  • Operatore !=
  • Alternativa: operatore not

7. Comparazioni 3

Domanda

Cosa stampa il codice seguente?

Esegui per verificare!

7. Comparazioni 4

Domanda

Per ciascuna delle espressioni seguenti, prova a indovinare se produce True o False

Procedi per vedere i risultati

Espressione Risultato
'cappello' != 'Cappello' True
'cappello' == 'CAPPELLO' False
'pensieroso'[4:8] == 'forestiero'[6:] True
'CoStOsO'[4:] == 'oSo' False
'chiaro'[9:20] == 'scuro'[10:15] True
'ramarro'[-1] == 'giglio'[-1] True
('cappello' != 'giacca') == ('pantaloni' != 'cravatta') True
('stra' in 'stradivarius') == ('div' in 'divano') True

7. Comparazioni 5

Domanda

Per ciascuna delle espressioni seguenti, prova a indovinare se produce True o False

Procedi per vedere i risultati

Espressione Risultato
len('nota') in '5436' ERROR
str(len('nota')) in '5436' True
len('cartellone') in '5436' ERROR
str(len('cartellone')) in '5436' False

7. Comparazioni 6

Esercizio - rockettaro

Scrivi del codice che stampa True se una parola inizia con le stesse due lettere con cui finisce

  • Il tuo codice deve funzionare per qualsiasi parola

7. Comparazioni 7

Comparare caratteri

  • I caratteri hanno un ordine che possiamo sfruttare
  • Deriva dalla codifica ASCII

7. Comparazioni 8

Comparare caratteri

  • Se vogliamo sapere il numero corrispondente di un carattere, possiamo usare la funzione ord
  • Per il contrario si usa chr

7. Comparazioni 9

Esercizio

Usando le funzioni di cui abbiamo parlato, prova a trovare quali caratteri sono tra la Z maiuscola e la a minuscola

7. Comparazioni 10

NOTA: l'ordine ci permette di eseguire comparazioni lessicografiche tra caratteri singoli!

7. Comparazioni 11

Esercizio

Scrivi del codice che

  1. stampa i valori ord di 'A', 'Z' e un dato carattere car
  2. stampa True se car è maiuscolo, e False altrimenti

Domanda: il tuo codice funzionerebbe anche con caratteri accentati capitalizzati come 'Á'?

Nota: gli insiemi di caratteri possibili sono parecchi, perciò la soluzione appropriata sarebbe usare il metodo isupper che vedremo prossimamente

7. Comparazioni 12

Comparare caratteri e ord

  • Unicode include l'ASCII
  • Comparare i caratteri o i loro ord dovrebbe essere sempre equivalente

7. Comparazioni 13

Comparare stringhe

  • Python offre anche comparazioni lessigrafiche su stringhe con più di un carattere
  • Per capire il risultato atteso, dobbiamo distinguere due casi:
    • stringhe di lunghezza uguale / differente
    • stringhe con capitalizzazione uguale / diversa

7. Comparazioni 14

Stringhe con stessa lunghezza

Stringhe con lunghezza diversa

7. Comparazioni 15

Esercizio - Intervalli di caratteri

Ti vengono fornite due coppie di stringhe i1 e i2 da due caratteri ciascuna

Supponi che rappresentino intervalli di caratteri: il primo carattere di un intervallo ha sempre un numero d’ordine inferiore o uguale al secondo.

Ci sono 5 possibilità: il primo intervallo 'è contenuto in','contiene', 'si sovrappone parzialmente a', 'è prima', oppure 'è dopo' il secondo intervallo.

Scrivi del codice che dice quale relazione di contenimento abbiamo

Esempio 1: dati

i1 = 'gm'
i2 = 'cp'

il tuo programma dovrebbe stampare gm è contenuto in cp

Per vedere perché, guarda questa rappresentazione (non è necessario stamparla!)

  c   g     m  p
abcdefghijklmnopqrstuvwxyz

7. Comparazioni 16

Esempio 2: dati

i1 = 'mr'
i2 = 'pt'

il tuo programma dovrebbe stampare mr si sovrappone parzialmente a pt

perchè mr non è contenuto né contiene né completamente precede né completamente segue pt

            m  p r t
abcdefghijklmnopqrstuvwxyz
  • se l’intervallo i1 coincide con i2, è considerato come contenente i2
  • NON usare cicli né if
  • SUGGERIMENTO: per soddisfare i vincoli qui sopra, pensa all’ordine di valutazione dei booleani
'g' >= 'c' and 'm' <= 'p' and 'è contenuto in'

produce come risultato la stringa 'è contenuto in'

7. Comparazioni 17

7. Comparazioni 18

Esercizio - La biblioteca di Encodicus

Nello studio dell’algoritmista Encodicus è presente uno scaffale diviso in 26 sezioni ordinate alfabeticamente, ove custodisce gelosamente i suoi preziosi testi alchemici. Ciascuna sezione può contenere al massimo 9 libri.

Un giorno, Encodicus decide di acquistare un nuovo tomo da aggiungere alla sua collezione: scrivi del codice che data una stringa rappresentante lo scaffale con i conteggi dei libri e un nuovo libro, trovi la giusta posizione del libro e aggiorni scaffale di conseguenza

  • assumi che nessuna sezione contenga 9 libri
  • assumi che i nomi dei libri siano sempre in minuscolo
  • NON usare cicli, if, o metodi delle stringhe
  • NON scrivere manualmente stringhe con 26 caratteri, o peggio creare 26 variabili
  • USA ord per trovare la posizione della sezione

7. Comparazioni 19

Esempio: dati

scaffale = "|a 7|b 5|c 5|d 8|e 2|f 0|g 4|h 8|i 7|j 1|k 6|l 0|m 5|n 0|o 3|p 7|q 2|r 2|s 4|t 6|u 1|v 3|w 3|x 5|y 7|z 6|"
libro = "ciclare all'aperto"

dopo il tuo codice scaffale deve risultare aggiornato con |c6|

|a 7|b 5|c 6|d 8|e 2|f 0|g 4|h 8|i 7|j 1|k 6|l 0|m 5|n 0|o 3|p 7|q 2|r 2|s 4|t 6|u 1|v 3|w 3|x 5|y 7|z 6|

8. Replicazione 1

Operatore di replicazione

  • Con l’operatore * puoi replicare una stringa n volte
  • Viene creata una nuova stringa

8. Replicazione 2

Esercizio - za za za

Data una sillaba e una frase che termina con una carattere n come cifra, scrivi del codice che stampa una stringa con la sillaba ripetuta n volte, separate da spazi

  • Il tuo codice deve funzionare con qualsiasi stringa assegnata a sillaba e frase

Esempio: date

frase = 'Il numero 7'
sillaba = 'za'

il tuo codice deve stampare

za za za za za za za