Stringhe 4 - metodi di ricerca
Scarica zip esercizi
Le stringhe mettono a disposizione diversi metodi per effettuare ricerche e e trasformarle in nuove stringhe, ma attenzione: il potere è nulla senza il controllo! A volte ti troverai con l’esigenza di usarli, e potrebbero anche funzionare con qualche piccolo esempio, ma spesso nascondono tranelli che poi si rimpiangono amaramente. Quindi quando scrivi codice con uno di questi metodi, poniti sempre le domande che evidenzieremo!
ATTENZIONE: Quando i metodi sulle stringhe generano una stringa, questa è SEMPRE NUOVA
L’oggetto stringa originale non viene MAI modificato (perchè le stringhe sono immutabili).
Metodo |
Risultato |
Significato |
---|---|---|
|
Rimuove stringhe dai lati |
|
|
Rimuove stringhe da sinistra |
|
|
Rimuove stringhe da destra |
|
|
Conta il numero di occorrenze di una sottostringa |
|
|
Ritorna la prima posizione di una sottostringa a partire da sinistra |
|
|
Ritorna la prima posizione di una sottostringa a partire da destra |
|
|
Sostituisce sottostringhe |
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
strings
strings1.ipynb
strings1-sol.ipynb
strings2.ipynb
strings2-sol.ipynb
strings3.ipynb
strings3-sol.ipynb
strings4.ipynb
strings4-sol.ipynb
strings5-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
strings4.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 strip
Elimina spazi bianchi, tab e ritorni a capo dalle estremità della stringa. In genere, questo insieme di caratteri viene definito blank
NOTA: NON rimuove i blank tra le parole della stringa! Solo quelli all’estremità destra e sinistra.
[2]:
x = ' \t\n\n\t carpe diem \t ' # alle estremità abbiamo messo spazi bianchi, tab e ritorni a capo
[3]:
x
[3]:
' \t\n\n\t carpe diem \t '
[4]:
print(x)
carpe diem
[5]:
len(x) # ricorda che i caratteri speciali come \t e \n occupano 1 carattere
[5]:
20
[6]:
y = x.strip()
[7]:
y
[7]:
'carpe diem'
[8]:
print(y)
carpe diem
[9]:
len(y)
[9]:
10
[10]:
x # IMPORTANTE: x è ancora associato alla vecchia stringa !
[10]:
' \t\n\n\t carpe diem \t '
Specificare i caratteri da rimuovere
Se vuoi che Python si limiti a rimuovere solo qualche carattere specifico, puoi specificarli in parentesi. Proviamo a specificarne solo uno:
[11]:
'salsa'.strip('s') # nota che la `s` interna non è rimossa
[11]:
'alsa'
Se ne specifichiamo due o più, Python rimuove tutti i caratteri che può trovare dai lati
Nota che l’ordine in cui specifichi i caratteri non conta:
[12]:
'caustic'.strip('aci')
[12]:
'ust'
ATTENZIONE: Se specifichi i caratteri, Python non proverà più a rimuovere i *blank!*
[13]:
'bouquet '.strip('b') # non rimuoverà gli spazi a destra!
[13]:
'ouquet '
[14]:
'\tbouquet '.strip('b') # ... nè rimuoverà i blank a sinistra come il tab
[14]:
'\tbouquet '
Secondo lo stesso principio, se specifichi uno spazio ' '
, allora Python rimuoverà solo gli spazi e non cercherà gli altri blank !!
[15]:
' attento! \t'.strip(' ') # rimuove solo dalla sinistra!
[15]:
'attento! \t'
DOMANDA: per ciascuna delle espressioni seguenti, prova ad indovinare che risultato produce (o se da errore):
'\ttumultuoso\n'.strip()
' a b c '.strip()
'\ta\tb\t'.strip()
'\\tMmm'.strip()
'sky diving'.strip('sky')
'anacondas'.strip('sad')
'\nno way '.strip(' ')
'\nno way '.strip('\\n')
'\nno way '.strip('\n')
'salsa'.strip('as')
'\t ACE '.strip('\t')
' e allora? '.strip("")
str(-3+1).strip("+"+"-")
Esercizio - Biblio blank
Hai appena coronato il tuo sogno: sei stata assunta nella cyber-biblioteca! Era da quando frequentavi il Gymnasiuz Lunare nel 2365 che sognavavi di contribuire a mantenere e tramandare la conoscenza umana accumulata nei secoli. Dovrai controllare il lavoro di un Intelligenza Artificiale che legge e trascrive un’interessante cronaca dal titolo “Pagine Bianche 2021”.
Le Pagine hanno degli elenchi di numeri formati in questa maniera:
Nome Cognome Prefisso-Suffisso
Tuttavia la macchina è difettosa e per ogni riga che legge tende a inserire dei caratteri blank (spazi, caratteri di controllo come \t
e \n
, …):
a volte deve scaldare la testina mobile, causando la lettura di numerosi blank prima del testo
a volte l’Intelligenza Artificiale rimane così colpita dal contenuto che si dimentica di spegnere la lettura aggiungendo così blank in coda
Dovrebbe invece produrre una stringa con trattino iniziale e punto finale:
-
Nome Cognome Prefisso-Suffisso.
Scrivi del codice per sistemare il prodotto dell’IA pasticciona.
Mostra soluzione[16]:
riga = ' \t \n Mario Rossi 0323-454345 \t \t ' # - Mario Rossi 0323-454345.
#riga = ' Ernesto Spadafesso 0323-454345 \n' # - Ernesto Spadafesso 0323-454345.
#riga = ' Gianantonia Marcolina Carla Napoleone 0323-454345 \t'
#riga = '\nChiara Ermellino 0323-454345 \n \n'
#riga = ' \tGiada Pietraverde 0323-454345\n\t'
# scrivi qui
Metodo lstrip
Elimina spazi bianchi, tab e ritorni a capo dall’ estremità sinistra della stringa.
NOTA: NON rimuove i blank tra le parole della stringa! Solo quelli all’estremità sinistra.
[17]:
x = '\n \t la strada \t '
[18]:
x
[18]:
'\n \t la strada \t '
[19]:
len(x)
[19]:
16
[20]:
y = x.lstrip()
[21]:
y
[21]:
'la strada \t '
[22]:
len(y)
[22]:
12
[23]:
x # IMPORTANTE: x è ancora associato alla vecchia stringa !
[23]:
'\n \t la strada \t '
Metodo rstrip
Elimina spazi bianchi, tab e ritorni a capo dall’ estremità destra della stringa.
NOTA: NON rimuove i blank tra le parole della stringa! Solo quelli all’estremità destra.
[24]:
x = '\n \t il faro \t '
[25]:
x
[25]:
'\n \t il faro \t '
[26]:
len(x)
[26]:
14
[27]:
y = x.rstrip()
[28]:
y
[28]:
'\n \t il faro'
[29]:
len(y)
[29]:
11
[30]:
x # IMPORTANTE: x è ancora associato alla vecchia stringa !
[30]:
'\n \t il faro \t '
Esercizio - Bad to the bone
Hai una stringa in maiuscolo s
che contiene ai lati dei caratteri che vuoi rimuovere: punteggiatura
, un carattere
minuscolo e dei blank. Scrivi del codice per eseguire la rimozione
Esempio - dati:
carattere = 'b'
punteggiatura = '!?.;,'
s = ' \t\n...bbbbbBAD TO THE BONE\n!'
il tuo codice dovrebbe mostrare:
'BAD TO THE BONE'
usa solo i metodi
strip
(olstrip
erstrip
) (se necessario, puoi fare chiamate ripetute)
[31]:
carattere = 'b'
punteggiatura = '!?.;,'
s = ' \t\n...bbbbbBAD TO THE BONE\n!'
# scrivi qui
Metodo count
Il metodo count
prende una sottostringa e conta quante occorrenze vi sono nella stringa prima del punto.
[32]:
"raggi astrali".count('a')
[32]:
3
[33]:
"raggi astrali".count('A') # distingue maiuscole/minuscole
[33]:
0
[34]:
"raggi astrali".count('st')
[34]:
1
Opzionalmente, puoi passare due altri parametri per denotare un indice da quale partire a contare (incluso) e dove terminare (escluso):
[35]:
#012345678901
"raggi astrali".count('a',4)
[35]:
2
[36]:
#0123456789012
"raggi astrali".count('a',4,9)
[36]:
1
Non abusare count
ATTENZIONE: count
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la stringa su cui operare potrebbe contenere duplicati? Ricordati che verranno tutti conteggiati!
la stringa potrebbe non contenere la sottostringa da conteggiare? Ricordati di gestire anche questo caso!
count
compie una ricerca in tutta la stringa, che può essere inefficiente: è proprio necessaria, o sappiamo già l’intervallo in cui cercare?
Esercizio - denaro astrale
Durante il lockdown 2020, mentre guardavi le stelle nella notte, hai cominciato a sentire… onde. Rimuginandoci sopra, hai deciso che LORO vogliono comunicare con te, perciò hai montato un antenna satellitare sul tuo tetto per ricevere messaggi dagli alieni. Dopo mesi di rumori apparentemente irrilevanti, un giorno hai finalmente ricevuto un radio-messaggio che pensi di poter tradurre. Gli alieni ovviamente stanno cercando di dirti i numeri vincenti della lotto!
Un messaggio è una sequenza di esattamente 3 diverse ripetizioni di caratteri: il numero di caratteri in ogni ripetizione è un numero che proverai alla lotteria. Inizi freneticamente a sviluppare il traduttore per mostrare questi numeri fortunati sul terminale.
Esempio - data:
s = '$$$$€€€€€!!'
dovrebbe stampare:
$ € !
4 5 2
IMPORTANTE: puoi assumere che tutte le sequenze abbiano caratteri *differenti*
NON usare cicli nè comprehension
per semplicità assumi che ogni sequenza di caratteri abbia al più 9 ripetizioni
[37]:
#01234567890 # $ € !
s = '$$$$€€€€€!!' # 4 5 2
# I M Q
#s = 'IIIMMMMMMQQQ' # 3 6 3
# H A L
#s = 'HAL' # 1 1 1
# scrivi qui
Metodo find
find
ritorna l’indice della prima occorrenza di qualche sottostringa data:
[38]:
#0123456789012345
'bingo bongo bong'.find('ong')
[38]:
7
Se nessuna occorrenza è trovata, ritorna -1
:
[39]:
#0123456789012345
'bingo bongo bong'.find('bang')
[39]:
-1
[40]:
#0123456789012345
'bingo bongo bong'.find('Bong') # differenzia tra maiuscole/minuscole
[40]:
-1
Opzionalmente, puoi specificare un indice da dove iniziare a cercare (incluso):
[41]:
#0123456789012345
'bingo bongo bong'.find('ong',10)
[41]:
13
E anche dove finire (escluso):
[42]:
#0123456789012345
'bingo bongo bong'.find('g',4, 9)
[42]:
-1
Metodo rfind
Come il metodo find, ma la ricerca inizia dalla destra.
Non abusare find
ATTENZIONE: find
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la stringa su cui operare potrebbe contenere duplicati? Ricordati che solo il primo verrà trovato!
la stringa potrebbe non contenere la sottostringa cercata? Ricordati di gestire anche questo caso!
find
compie una ricerca in tutta la stringa, che può essere inefficiente: è proprio necessaria, o sappiamo già l’intervallo in cui cercare?se vogliamo sapere se un
carattere
è in una posizione nota a priori (es3
),find
non ci serve, basta scriverestringa[3] == carattere
. Usandofind
potrebbe trovare caratteri duplicati che stanno prima o dopo di quello che vogliamo verificare!
Esercizio - Il porto di Monkey Island
L’isola di Monkey Island ha un porto che dispone di 4 moli a cui attraccano le navi provenienti da tutto l’arcipelago. Il punto di attracco non è mai preciso, e possono esserci degli spazi arbitrari con i bordi dei moli. Vi possono anche essere navi dal nome duplicato.
Supponiamo che ad ogni molo può contenere una sola nave, e vogliamo scrivere del codice che mostri
True
se la"The Jolly Rasta"
è attraccata al molo2
oppureFalse
altrimenti.
Guarda i porti seguenti, e per ciascun cerca di indovinare se le righe di codice seguenti produrranno risultati corretti oppure no. Prova poi a scrivere del codice da te che non abbia i problemi che riscontrerai.
NON usare istruzioni
if
, cicli nè comprehensionNON usare liste (quindi niente
.split
)
[43]:
larghezza = 21 # larghezza di un molo, INCLUSO il `|` di destra
molo = 2
# moli : 1 2 3 4
porto = "The Mad Monkey | The Jolly Rasta | The Sea Cucumber |LeChuck's Ghost Ship|"
#porto = " The Mad Monkey | | The Sea Cucumber |LeChuck's Ghost Ship|"
#porto = " The Mad Monkey |The Jolly Rasta | The Sea Cucumber | |"
#porto = "The Jolly Rasta | | The Sea Cucumber|LeChuck's Ghost Ship|"
#porto = " | The Mad Monkey | The Jolly Rasta |LeChuck's Ghost Ship|"
#porto = " The Jolly Rasta | | The Jolly Rasta | The Jolly Rasta |"
print('La Jolly Rasta è attraccata al molo', molo, '?')
print()
print(porto)
print()
print(' in:', 'The Jolly Rasta' in porto)
print()
print(' find su tutto:', porto.find('The Jolly Rasta') != -1)
print()
print(' find dal secondo molo:', porto.find('The Jolly Rasta', larghezza*(molo-1)) != -1)
# scrivi qui
La Jolly Rasta è attraccata al molo 2 ?
The Mad Monkey | The Jolly Rasta | The Sea Cucumber |LeChuck's Ghost Ship|
in: True
find su tutto: True
find dal secondo molo: True
Soluzione: True
Supponiamo ora che ogni molo possa accogliere più di una nave, anche con lo stesso nome. Scrivi del codice che mostri
True
se una sola Grog Ship è attraccata al secondo molo,False
altrimenti.
[44]:
larghezza = 21 # larghezza di un molo, INCLUSO il `|` di destra
molo = 2
# moli : 1 2 3 4
porto = "The Mad Monkey |The Jolly Rasta | The Sea Cucumber |LeChuck's Ghost Ship|"
#porto = "The Mad Monkey | Grog Ship Grog Ship| The Jolly Rasta | The Sea Cucumber "
#porto = " The Jolly Rasta | Grog Ship | The Jolly Rasta | The Jolly Rasta "
#porto = " Grog Ship | Grog Ship |LeChuck's Ghost Ship| Grog Ship "
#porto = "LeChuck's Ghost Ship| | Grog Ship | The Jolly Rasta "
#porto = "The Jolly Rasta | Grog Ship Grog Ship| Grog Ship | The Jolly Rasta "
print()
print('Una sola Grog Ship è attraccata al molo', molo, '?')
print()
# scrivi qui
Una sola Grog Ship è attraccata al molo 2 ?
Soluzione Grog Ship: False
Esercizio - banane
Durante l’esplorazione di una regione tropicale remota, un etologo scopre una popolazione di scimmie che sembra abbiano qualche concetto dei numeri. Collezionano centinaia di banane che sono poi scambiate con noci di cocco collezionate da un’altro gruppo. Per comunicare quantità fino a 999 banane, usano una serie di esattamente tre suoni gutturali. L’etologo scrive le sequenze e formula la teoria seguente: ogni suono è rappresentato da una sequenza dello stesso carattere, ripetuto un certo numero di volte. Il numero di caratteri nella prima sequenza è la prima cifra (le centinaia), il numero di caratteri nella seconda sequenza è la seconda cifra (le decine), mentre l’ultima sequenza rappresenta le unità.
Scrivi del codice che mette nella variabile banane
un intero che rappresenti il numero.
Per esempio - dati:
s = 'bb bbbbb aaaa'
il tuo codice dovrebbe stampare:
>>> banane
254
>>> type(banane)
int
IMPORTANTE 1: sequenze differenti possono usare lo *stesso* carattere!
IMPORTANTE 2: non puoi assumere quali caratteri le scimmie useranno: conosci solo che ogni cifra è rappresentata da una ripetizione dello stesso carattere
NON usare cicli nè comprehensions
le scimmie non hanno cognizione dello zero
[45]:
#0123456789012
s = 'bb bbbbb aaaa' # 254
#s = 'ccc cc ccc' # 323
#s = 'vvv rrrr ww' # 342
#s = 'cccc h jjj' # 413
#s = '🌳🌳🌳 🍌🍌🍌🍌🍌🍌 🐵🐵🐵🐵' # 364 (potresti ottenere *qualunque* strano carattere, anche unicode ...)
# scrivi qui
Metodo replace
str.replace
prende due stringhe, e restituisce una NUOVA stringa ricavata sostituendo nella stringa su cui è chiamata tutte le occorrenze del primo parametero stringa con il secondo.
Esempio:
[46]:
"il treno percorre".replace('re', 'RO')
[46]:
'il tROno percorRO'
[47]:
"alberello bello".replace('llo', 'llini')
[47]:
'alberellini bellini'
[48]:
"parlare e brindare".replace('ARE', 'iamo') # se cerchiamo maiuscole qua non le troveremo
[48]:
'parlare e brindare'
[49]:
"PARLARE E BRINDARE".replace('ARE', 'IAMO') # ma qua sì
[49]:
'PARLIAMO E BRINDIAMO'
Come sempre per le stringhe, replace
NON modifica la stringa su cui è chiamato:
[50]:
x = "sulla panca"
[51]:
y = x.replace('panca', 'panca la capra campa')
[52]:
y
[52]:
'sulla panca la capra campa'
[53]:
x # IMPORTANTE: x è ancora associato alla vecchia stringa !
[53]:
'sulla panca'
E’ possile specificare fino a quante occorrenze verranno sostituite:
[54]:
'apollo fece una palla di pelle di pollo'.replace('ll', 'Zz', 3)
[54]:
'apoZzo fece una paZza di peZze di pollo'
DOMANDA: per ciascuna delle espressioni seguenti, prova ad indovinare quale risultato produce (o se da errore)
'$£mangia il ricco£$'.replace('£','').replace('$','')
'$£mangia il ricco£$'.strip('£').strip('$')
Non abusare replace
ATTENZIONE: replace
viene spesso usato in modo errato / inefficiente
Chiediti sempre:
la stringa su cui operare potrebbe contenere duplicati? Ricordati che verranno tutti sostituiti!
replace
compie una ricerca in tutta la stringa, che può essere inefficiente: è proprio necessaria, o sappiamo già la posizione dove è presente il testo da sostituire?
Esercizio - Non aprite quella porta
DOMANDA Hai una biblioteca di libri, con etichette come G-Il padrino
, R-I promessi sposi
o 'H-Non aprite quella porta'
composte da una un carattere che identifica il tipo (G
giallo, R
romanzo, H
horror) seguito da -
e dal titolo. Dato un libro
, vuoi stampare l’etichetta completa, due punti e poi il titolo, come 'Giallo: Il padrino'
. Guarda i seguenti frammenti di codice, e per ciascuno prova a scrivere delle etichette tra quelle proposte o creane altre
che darebbero risultati errati (se esistono)
libro = 'G-Il padrino'
libro = 'R-I promessi sposi'
libro = 'H-Non aprite quella porta'
libro.replace('G', 'Giallo: ').replace('R', 'Romanzo: ')
libro[0].replace('G', 'Giallo: ') \ .replace('H', 'HORROR: ') \ .replace('R', 'Romanzo: ') + libro[2:]
libro.replace('G-', 'Giallo: ').replace('R-', 'Romanzo: ')
libro.replace('G-', 'Giallo: ',1).replace('R-', 'Romanzo: ',1)
libro[0:2].replace('G-', 'Giallo: ').replace('R-', 'Romanzo: ') + libro[2:]
[55]:
Esercizio - Il Regno degli Stringardi
La landa dei Caratterinzi è dominata col pugno di ferro dal Ducato degli Stringardi. I borghi comandati degli Stringardi si distinguono per essere monodimensionali e possono essere rappresentati come una stringa: offrono ospitalità ai duchi 'd'
, ai signori 's'
, ai vassalli 'v'
, e alla plebe 'p'
. Al fine di separare le varie cerchie sociali da disdicevoli commistioni sono state erette delle mura |mm|
. Purtroppo, il Ducato è sotto attacco dalla tribù dei beceri Replaceri, che
con loro tecniche barbare e poco avvedute rischiano di radere al suolo la città. Per difendersi, gli Stringardi decidono di innalzare le mura, trasformandole da |mm|
a |MM|
.
NON usare cicli nè list comprehension
NON usare liste (quindi niente split)
Stringardi I: Innalza tutte le mura
Esempio - dati:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
dopo il tuo codice, deve risultare:
>>> borgo
'ppp|MM|vvvvvv|MM|sss|MM|dd|MM|sssss|MM|vvvvvv|MM|pppppp'
[56]:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
# risultato: 'ppp|MM|vvvvvv|MM|sss|MM|dd|MM|sssss|MM|vvvvvv|MM|pppppp'
# scrivi qui
Stringardi II: Mura esterne
Purtroppo la plebaglia non lavora abbastanza e non vi sono fondi per innalzare tutte le mura: innalza solo le mura all’esterno
NON usare
if
, cicli nè list comprehensionNON usare liste (quindi niente split)
Esempio - dati:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
dopo il tuo codice, deve risultare:
>>> borgo
'ppp|MM|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|MM|pppppp'
[57]:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
#risultato: 'ppp|MM|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|MM|pppppp'
#borgo = '|mm|vvvvvv|mm||mm|ddddd|mm|ssvvv|mm|pp'
#risultato: '|MM|vvvvvv|mm||mm|ddddd|mm|ssvvv|MM|pp'
# scrivi qui
Stringardi III: Potere al popolo
Una minaccia ancora più grande affligge gli Stringardi: la democrazia. A seguito del dilagare di questo male oscuro, in alcune città si sono sviluppate fazioni di destra e sinistra, che tendono a privilegiare solo alcune parti della città. Se il sentimento dominante di una città è di sinistra, tutte le abitazioni a sinistra del duca sono privilegiate a suon di dobloni, altrimenti se di destra sono privilegiate quelle a destra del duca. Quando una casa è privilegiata la lettera corrispondente viene resa in maiuscolo.
assumi che almeno un blocco con
d
sia sempre presente, e che sia unicoNON usare
if
, cicli nè list comprehensionNON usare liste (quindi niente split)
3.1) privilegia solo le case di sinistra
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
dopo il tuo codice, deve risultare:
>>> borgo
'PPP|mm|VVVVVV|mm|SSS|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
[58]:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
# risultato: 'PPP|mm|VVVVVV|mm|SSS|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
#borgo = '|p|ppp||p|pp|mm|vvv|vvvv|mm|sssss|mm|ddd|mm|ssss|ss|mm|vvvvvv|mm|'
# risultato: '|P|PPP||P|PP|mm|VVV|VVVV|mm|SSSSS|mm|ddd|mm|ssss|ss|mm|vvvvvv|mm|'
# scrivi qui
3.2) privilegia solo le case di destra
Esempio - dati:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
dopo il tuo codice, deve risultare:
>>> borgo
'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|SSSSS|mm|VVVVVV|mm|PPPPPP'
[59]:
borgo = 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|sssss|mm|vvvvvv|mm|pppppp'
#risultato: 'ppp|mm|vvvvvv|mm|sss|mm|dd|mm|SSSSS|mm|VVVVVV|mm|PPPPPP'
#borgo = '|p|ppp||p|pp|mm|vvv|vvvv|mm|sssss|mm|ddd|mm|ssss|ss|mm|vvvvvv|p|pp|mm|'
#risultato: '|p|ppp||p|pp|mm|vvv|vvvv|mm|sssss|mm|ddd|mm|SSSS|SS|mm|VVVVVV|P|PP|mm|'
# scrivi qui
Stringardi IV: Lotte di potere
Nel tempo la famiglia ducale si è espansa e purtroppo sono nate faide spietate. A seconda della popolosità del borgo di sinistra o destra, un corrispondente numero dei membri della famiglia più a sinistra nel palazzo ducale o più a destra ricevono supporto per attuare i loro giochi di potere. Un membro del palazzo ducale che riceve supporto diventa in maiuscolo. Ogni lettera 'p'
, 'v'
o 's'
contribuisce supporto (ma non i muri). I membri della famiglia ducale che non sono raggiunti da
nessun supporto vengono trucidati dai parenti, e sostituiti con una Latin Cross Unicode ✝
assumi che almeno un blocco con
d
sia sempre presente, e che sia unicoassumi che per ogni casa di sinistra/destra, vi sia almeno un duca di sinistra/destra
NON usare
if
, cicli nè list comprehensionNON usare liste (quindi niente split)
Esempio - dato:
borgo = 'ppp|mm|vv|mm|v|s|mm|dddddddddddddddddddddddd|mm|ss|mm|vvvvv|mm|pppp'
Dopo il tuo codice, deve stampare:
Membri della famiglia reale: 24
di sinistra: 7
di destra: 11
Dopo la lotta fratricida, il nuovo borgo è:
ppp|mm|vv|mm|v|s|mm|DDDDDDD✝✝✝✝✝✝DDDDDDDDDDD|mm|ss|mm|vvvvv|mm|pppp
[60]:
borgo = 'ppp|mm|vv|mm|v|s|mm|dddddddddddddddddddddddd|mm|ss|mm|vvvvv|mm|pppp'
#risultato: 'ppp|mm|vv|mm|v|s|mm|DDDDDDD✝✝✝✝✝✝DDDDDDDDDDD|mm|ss|mm|vvvvv|mm|pppp' tot:24 sx:7 dx:11
#borgo = 'ppp|mm|ppp|mm|vv|mm|ss|mm|dddddddddddddddddddd|mm|ss|mm|mm|s|v|mm|p|p|'
#risultato: 'ppp|mm|ppp|mm|vv|mm|ss|mm|DDDDDDDDDD✝✝✝✝DDDDDD|mm|ss|mm|mm|s|v|mm|p|p|' tot:20 sx:10 dx:6
# scrivi qui
Altri esercizi
DOMANDA: Per ciascuna espressione di seguito, cerca di indovinare il risultato.
'gUrP'.lower() == 'GuRp'.lower()
'NaNo'.lower() != 'nAnO'.upper()
'O' + 'ortaggio'.replace('o','\t \n ').strip() + 'O'
'DaDo'.replace('D','b') in 'barbados'
Prosegui
Continua con le prime challenge