Stringhe 4 - metodi di ricerca

Scarica zip esercizi

Naviga file online

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

str1.strip(str2)

str

Rimuove stringhe dai lati

str1.lstrip(str2)

str

Rimuove stringhe da sinistra

str1.rstrip(str2)

str

Rimuove stringhe da destra

str1.count(str2)

int

Conta il numero di occorrenze di una sottostringa

str1.find(str2)

int

Ritorna la prima posizione di una sottostringa a partire da sinistra

str1.rfind(str2)

int

Ritorna la prima posizione di una sottostringa a partire da destra

str1.replace(str2, str3)

str

Sostituisce sottostringhe

Che fare

  1. 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.

  1. 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

  2. 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):

  1. '\ttumultuoso\n'.strip()
    
  2. ' a b c '.strip()
    
  3. '\ta\tb\t'.strip()
    
  4. '\\tMmm'.strip()
    
  5. 'sky diving'.strip('sky')
    
  6. 'anacondas'.strip('sad')
    
  7. '\nno way '.strip(' ')
    
  8. '\nno way '.strip('\\n')
    
  9. '\nno way '.strip('\n')
    
  10. 'salsa'.strip('as')
    
  11. '\t ACE '.strip('\t')
    
  12. ' e allora? '.strip("")
    
  13. 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 (o lstrip e rstrip) (se necessario, puoi fare chiamate ripetute)

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

  1. la stringa su cui operare potrebbe contenere duplicati? Ricordati che verranno tutti conteggiati!

  2. la stringa potrebbe non contenere la sottostringa da conteggiare? Ricordati di gestire anche questo caso!

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

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

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

  2. la stringa potrebbe non contenere la sottostringa cercata? Ricordati di gestire anche questo caso!

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

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

  1. 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 molo 2 oppure False 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è comprehension

  • NON usare liste (quindi niente .split)

Mostra soluzione
[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
  1. 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.

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

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

  1. '$£mangia il ricco£$'.replace('£','').replace('$','')
    
  2. '$£mangia il ricco£$'.strip('£').strip('$')
    

Non abusare replace

ATTENZIONE: replace viene spesso usato in modo errato / inefficiente

Chiediti sempre:

  1. la stringa su cui operare potrebbe contenere duplicati? Ricordati che verranno tutti sostituiti!

  2. 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'
  1. libro.replace('G', 'Giallo: ').replace('R', 'Romanzo: ')
    
  2. libro[0].replace('G', 'Giallo: ')  \
            .replace('H', 'HORROR: ')  \
            .replace('R', 'Romanzo: ') + libro[2:]
    
  3. libro.replace('G-', 'Giallo: ').replace('R-', 'Romanzo: ')
    
  4. libro.replace('G-', 'Giallo: ',1).replace('R-', 'Romanzo: ',1)
    
  5. libro[0:2].replace('G-', 'Giallo: ').replace('R-', 'Romanzo: ') + libro[2:]
    
Mostra soluzione
[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'
Mostra soluzione
[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 comprehension

  • NON 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'
Mostra soluzione
[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 unico

  • NON usare if, cicli nè list comprehension

  • NON 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'
Mostra soluzione
[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'
Mostra soluzione
[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 unico

  • assumi che per ogni casa di sinistra/destra, vi sia almeno un duca di sinistra/destra

  • NON usare if, cicli nè list comprehension

  • NON 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
Mostra soluzione
[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.

  1. 'gUrP'.lower() == 'GuRp'.lower()
    
  2. 'NaNo'.lower() != 'nAnO'.upper()
    
  3. 'O' + 'ortaggio'.replace('o','\t \n     ').strip() + 'O'
    
  4. 'DaDo'.replace('D','b') in 'barbados'
    

Prosegui

Continua con le prime challenge