Ecco come modificare il codice esistente in modo che si fa ciò che si vuole. Ho modificato newWord
in new_word
per conformarmi alla convenzione standard in stile Python.
def replace(char, word1, word2):
new_word = ""
for i in range(len(word2)):
if word1[i] == char:
new_word += char
else:
new_word += word2[i]
return new_word
# Test
print(replace("p", "apple", "12345"))
uscita
1pp45
noti che questo codice genera un'eccezione IndexError: string index out of range
se word1
è più corto word2
.
Esistono vari modi migliori per implementare questa funzione. In primo luogo, possiamo usare la funzione zip
per iterare sui caratteri di entrambe le stringhe in parallelo. Questo è un po 'più pulito della tua iterazione indiretta usando gli indici delle stringhe per accedere ai personaggi.
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
if c1 == char:
new_word += char
else:
new_word += c2
return new_word
Si noti che se le stringhe non sono della stessa lunghezza allora zip
si fermerà con grazia quando la stringa più corta finisce.
Possiamo rendere il codice più compatto sostituendo il blocco if... else
con un'espressione condizionale.
def replace(char, word1, word2):
new_word = ""
for c1, c2 in zip(word1, word2):
new_word += char if c1 == char else c2
return new_word
Una versione più avanzata utilizza un elenco di comprensione per costruire una lista dei caratteri desiderati e il metodo di stringa .join
per convertire quella lista in una stringa.
def replace(char, word1, word2):
return ''.join([char if c1 == char else c2
for c1, c2 in zip(word1, word2)])
È anche possibile farlo utilizzando un'espressione di generatore.
''.join(char if c1 == char else c2 for c1, c2 in zip(word1, word2))
Tuttavia questo è meno efficiente rispetto all'utilizzo di un elenco di comprensione, a causa del modo in cui funziona .join
. .join
deve eseguire la scansione del suo argomento due volte: la prima scansione viene utilizzata per calcolare la dimensione totale della stringa di output, la seconda scansione esegue l'unione effettiva. Ma non è possibile scansionare un generatore due volte, quindi se si passa a un generatore .join
è necessario creare un elenco temporaneo dal generatore.
È necessario correggere il rientro dell'esempio di codice. – Carpetsmoker