Do you need any help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

Curiosità sulle stringhe

francesco.dev (33560 points)
14 51 129
asked Oct 3, 2017 in Programmare in Python by francesco.dev (33,560 points)
edited Oct 3, 2017 by francesco.dev
Ciao ragazzi e buon pomeriggio!

Premettendo che in Python possiamo fare molte cose sulle stringhe usando semplicemente gli stessi operatori che usiamo per le operazioni aritmetiche come l'addizione e la moltiplicazione (cosa che non può essere fatta in altri linguaggi) e che, ad esempio, possiamo concatenare le stringhe con un semplice "+" e ripetere la stessa stringa più volte moltiplicandola per un numero.

Ho il seguente dubbio sulle stringhe: perché se esistono dei modi così semplice per operare su di esse, per cambiare un unico valore di una stringa dobbiamo per forza "escogitare" e trovare qualche metodo che non risulti così immediato? Infatti per poter cambiare un solo carattere di una stringa io ho usato tale ragionamento (che vi mostro in pseudo-codice):
Prendo l'inizio della stringa fino alla posizione in cui si trova il carattere da modificare + il nuovo carattere + il resto della stringa.

La question è: esistono metodi alternativi per ovviare a tale problema? Esistono funzioni che compiono tale scopo? Ovviamente per me non è difficile usare il ragionamento che qui vi ho riportato, ma mi chiedo semplicemente se esiste una via di operare molto più efficiente!

Grazie a chi mi risponderà!

- Francesco Pio Scognamiglio

7 Answers

Best answer
V
Vlad (4580 points)
2 14 24
answered Oct 3, 2017 by Vlad (4,580 points)
selected Oct 3, 2017 by francesco.dev

Su stack overflow ho trovato una risposta che fa al caso nostro:
https://stackoverflow.com/questions/1228299/change-one-character-in-a-string

Praticamente il consiglio è quello di lavorare con le stringhe il meno possibile: usare una lista di caratteri per fare tutte le operazioni e convertire la lista in stringa solo quando è necessario.

Nel link c'è un esempio semplice e molto eloquente.

francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Ed allora il metodo che dovremmo tutti utilizzare è questo della conversione da stringa a lista, modifica del carattere e conversione da lista a stringa.
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Vlad ho scelto la tua risposta come la migliore perché hai spiegato in due parole come affrontare tale problema, portando come "controprova" una discussione di stackoverflow. Grazie del tuo aiuto!
V
Vlad (4580 points)
2 14 24
commented Oct 3, 2017 by Vlad (4,580 points)
Grazie mille!
andrea.sterbini (172780 points)
513 935 1789
commented Oct 4, 2017 by andrea.sterbini (172,780 points)
Ottima idea!
andrea.sterbini (172780 points)
513 935 1789
answered Oct 3, 2017 by andrea.sterbini (172,780 points)

ATTENZIONE: l'operatore + ed il * NON sono operatori aritmetici quando sono applicati alle stringhe ma in questo contesto sono:

  • +: la concatenazione di due stringhe per ottenere una nuova stringa
  • *: la ripetizione (concatenazione ripetuta)
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Vero, grazie per la correzione!
f
francesco.r (1070 points)
4 15 20
answered Oct 3, 2017 by francesco.r (1,070 points)
Ciao, esiste la funzione replace. Questa funzione prende in input due parametri, il primo parametro è la nuova sottostringa ed il secondo quella che vuoi sostituire. In pratica sostituisce tutte le occorrenze di una data sottostringa  con un' altra sottostringa, ma stai attento perché sostituisce tutte le occorrenze e non modifichi la stringa ma ne crei una nuova.

Ad esempio se chiami replace sulla stringa mimmo con i parametri m e c, quello che ottieni è la stringa ciccio.

Invece se vuoi sostituire una solo occorrenza di una sottostringa, credo che l'unico modo sia concatenare il nuovo carattere con il resto della stringa.

Spero di esserti stato d'aiuto.
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Ciao! Grazie per il tempo che hai dedicato.
Quindi per cambiare un solo carattere di una stringa si utilizza il metodo che ho detto prima.
Ovviamente era semplice curiosità!
Buona serata
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Hai fatto un piccolo errore, sicuramente per distrazione: se rimpiazzi la m con la c, invece di "mimmo" avrai "cicco" e non ciccio.
Gabriele97 (2010 points)
8 29 38
asked Oct 3, 2017 in Programmare in Python by Gabriele97 (2,010 points)
metodo str.format()
f
francesco.r (1070 points)
4 15 20
commented Oct 3, 2017 by francesco.r (1,070 points)
Giusto, spero comunque che sia chiaro a tutti.
split (8700 points)
15 59 79
answered Oct 3, 2017 by split (8,700 points)
non so se come ragionamento sia esatto e quindi ne approfitto per "fare una domanda" ed in caso essere smentito, ma se salvassi una stringa in una lista, lettera per lettera (una lettera per ogni posizione della lista) poi chiamando un ciclo giri la lista e modifichi solo determinate posizioni, dato che le liste sono modificabili? è un ragionamento un po' "alla C", ma mi sembra una soluzione forse non ottimale se devi gestire una singola stringa, ma più funzionale se pensi magari di dover analizzare un testo intero e di voler modificare solo qualcosa.

qualche tempo fa ho fatto un programmino semplice di questo tipo in C per modificare tutti i verbi di un dizionario aggiungendo i pronomi alla fine (studiare: studiarlo studiarne studiarsi ecc) perché il programma con cui scrivevo li riconosceva come errori. e sapendo usare solo il C ho fatto così. magari in python ci sono soluzioni migliori, aspetto anche io risposte migliori della mia :D
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
In C anche io mi trovavo molto bene ad operare in questo modo, anche perché le stringhe, nel C puro, non erano nient'altro che array (o vettori) di caratteri!
Già in Java cambiava la mentalità, ma in Python è ancora "peggio" hahahahaah!
Comunque l'uso di una lista per una parola semplice mi sembra davvero uno spreco, visto che le operazioni che possiamo fare sulle stringhe le possiamo fare ugualmente anche senza usare una lista di appoggio.
Infatti possiamo prendere un valore presente in una posizione (proprio come accadeva in C), possiamo concatenare le stringhe attraverso l'operatore di concatenazione +. Possiamo fare tutto tranne il fatto di poter modificare un singolo carattere, visto che le stringhe in Python sono immutabili e quindi dobbiamo creare qualche stratagemma, come quello che ho presentato e spiegato io!
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Infine, un piccolo appunto: creando una lista contenente per ogni posizione un carattere della stringa di partenza, non stai facendo nient'altro che portare il ragionamento dell'array di caratteri di C in Python. Però questo non è il modo più ottimale di agire! Se ci pensi, il metodo che ho descritto io nella domanda è molto più efficiente rispetto all'usare un nuovo oggetto di appoggio.
split (8700 points)
15 59 79
commented Oct 3, 2017 by split (8,700 points)
infatti, come ho specificato, la mia era più una domanda che una risposta :) ma era l'unico metodo che mi è venuto in mente per modificare un singolo carattere
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Hai fatto benissimo a dire il tuo pensiero! Siamo qui per imparare, mai dimenticarlo. Quindi mi ha fatto tanto piacere ricevere anche una tua risposta al mio quesito! :)
split (8700 points)
15 59 79
commented Oct 3, 2017 by split (8,700 points)
all fin fine non mi sono sbagliato poi tanto, vista la risposta migliore :D
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Sì, il tuo ragionamento si è rivelato in parte giusto! Grazie dell'aiuto
Neo (6720 points)
6 27 37
answered Oct 3, 2017 by Neo (6,720 points)

Ciao!

Potresti provare a utilizzare la funzione find! In poche parole se importi il modulo string e successivamente all'operazione di input della stringa esegui NomeModulo.NomeDellaFunzione (in questo caso " find ") e tra parentesi inserisci le condizioni di ricerca (Variabile str da analizzare, 'elemento da trovare') potresti sapere immediatamente la sua posizione e a questo punto modificare il suo "valore"! Se non sbaglio questa funzione ti troverà però unicamente il primo carattere o la porzione della stringa coincidente con i tuoi parametri di ricerca! Spero di averti aiutato wink

francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Grazie del tuo commento, ma qui la problematica è capire se esiste una funzione che permetta di poter fare quello che facevamo in C, ovvero assegnare all'i-esima posizione della stringa un valore a piacimento.
Però penso non si possa fare ed allora bisognerà usare il metodo che ho descritto in precedenza e che ti riporto qui:
Prendo l'inizio della stringa fino alla posizione in cui si trova il carattere da modificare + il nuovo carattere + il resto della stringa.
Neo (6720 points)
6 27 37
commented Oct 3, 2017 by Neo (6,720 points)
L'unico metodo che mi viene in mente è di trasformare tramite comando " list = variabile str " la variabile stringa in tipo lista e operare come in c/c++ ma in questo caso non lavori più su una stringa ma su una "lista di caratteri"
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Però pensa al mio metodo, penso sia più efficiente rispetto al creare un nuovo oggetto lista che conterrà tutti i caratteri della stringa.
Ovvero trovare dove si trova il carattere da modificare e creare una stringa che contiene:
 - la stringa iniziale che va da 0 alla posizione prima del carattere da cambiare;
 - il carattere nuovo;
 - la stringa finale che va dalla posizione dopo tale carattere fino alla fine.
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Anzi penso tu abbia ragione. Perché sotto anche un altro ragazzo consiglia di usare le liste, portando l'esempio di una discussione su stackoverflow.
Grazie dell'aiuto!
Neo (6720 points)
6 27 37
commented Oct 3, 2017 by Neo (6,720 points)
E di cosa! Per qualsiasi cosa sono sempre disponibile :D
Denis (2230 points)
3 13 23
answered Oct 3, 2017 by Denis (2,230 points)
Ciao Francesco,
Non capisco la premessa che mi sembra abbastanza fuorviante, hai provato a considerare la stringa come una lista?
Non ho il mio computer da sviluppo sotto mano, però mi sembra di ricordare che stringa[i] ti restituisca l' i-esimo carattere.
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Se leggi il metodo che ho adoperato per "Cambiare un singolo carattere della stringa" si basa proprio sul concetto di poter interagire con una singola posizione!
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Te lo riporto qui:
Prendo l'inizio della stringa fino alla posizione in cui si trova il carattere da modificare + il nuovo carattere + il resto della stringa.

Ovviamente è pseudo-codice perché non posso postare codice, ma se vedi bene la stringa che inizia da 0 e va fino ad i è proprio quella che si basa sul concetto di poter sapere il contenuto di una stringa all'i-esima posizione.
Denis (2230 points)
3 13 23
commented Oct 3, 2017 by Denis (2,230 points)
Più che altro io credevo che stringa[i] fosse assegnabile, ma stavo solo sognando.
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Magari fosse possibile.. Infatti quando l'ho scoperto a lezione ci sono rimasto di sasso, visto che in C o in Java era una cosa normalissima!
LeonardoEmili (35740 points)
11 65 155
answered Oct 3, 2017 by LeonardoEmili (35,740 points)
Ciao!
Mi vedo costretto a fare una domanda per rispondere alla tua domanda. Tu proponi di utilizzare il metodo di inserire la prima parte della stringa con uno slice + stringa da accendere + parte finale della stringa, il tutto inserito in una nuova variabile?
Ho capito bene?
Perdonami per gli innumerevoli giochi di parole ma preferisco avere ben chiaro il quadro per poter darti una risposta adeguata.
Ti auguro una buona serata!
francesco.dev (33560 points)
14 51 129
commented Oct 3, 2017 by francesco.dev (33,560 points)
Esatto. Comunque Vlad già ci ha dato un'accurata risposta! La trovi come la migliore e quindi come prima risposta accedendo a questo quesito.
LeonardoEmili (35740 points)
11 65 155
commented Oct 3, 2017 by LeonardoEmili (35,740 points)
Contento che tu abbia trovato risposta alla tua domanda :)