2016-03-04 19 views
5

Ho bisogno di creare una funzione che accetta i parametri (carattere, stringOne, stringTwo). La funzione restituisce una nuova parola che contiene gli stessi dati di stringTwo + qualsiasi carattere in stringOne nella stessa posizione.Sostituzione di caratteri da stringa uno a stringa due

Esempio:

  • stringOne = "mela"
  • stringTwo = "12345"
  • carattere = "p"
  • deve restituire "1pp45"

sono perduto su come dovrei procedere.

def replace(char, word1, word2): 
newWord = "" 
for s in range(len(word1)): 
    if word1[s] == char: 
return 
+4

È necessario correggere il rientro dell'esempio di codice. – Carpetsmoker

risposta

2

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.

1

È inoltre possibile utilizzare una lista di comprensione, iterare e sostituire.

>>> x, y, c = 'apple', '12345', 'p'    
>>> ''.join([c if x[i] == c else s for i, s in enumerate(y)]) 
'1pp45' 
+0

Questo non è il tipo di codice che vorrei mostrare a qualcuno che fatica ad imparare a programmare. – Carpetsmoker

1

Pythonic modo:

>>> stringOne = "apple" 
>>> stringTwo = "12345" 
>>> my_char = "p" 
>>> "".join([x[1] if my_char!=x[0] else x[0] for x in zip(stringOne, stringTwo)]) 
'1pp45' 
5

Continuando ciò che avete fatto, utilizzando semplici for-loop e il funzionamento ternario, ecco come si può fare:

def replace(char, word1, word2): 
    newWord = "" 
    for s in range(len(word1)): 
     newWord += char if word1[s] == char else word2[s] 
    return newWord 

che è equivalente a:

def replace(char, word1, word2): 
    newWord = "" 
    for s in range(len(word1)): 
     if word1[s] == char: 
      newWord += char 
     else: 
      newWord += word2[s] 
    return newWord 

Nel caso in cui non si abbia familiarità con le operazioni ternarie.

1
def replace(char, word1, word2): 
    newWord= list(word2) 
    for counter in range(min(len(word1), len(word2))): 
      if word1[counter]== char: 
        newWord[counter]= char 
    return "".join(newWord) 
0

La soluzione più semplice sarebbe quella di scorrere personaggi di parola1 e se una partita di carattere viene trovato con il carattere che siamo interessati a trovare, poi sostituire il carattere in quel indice in parola2.

def replace(char, word1, word2): 
    newWord = "" 
    word2List = list(word2) 
    # Check is character is present in word1 
    # and if length of word1 and word2 are equal 
    if char not in word1 or len(word1) != len(word2): 
     return False 
    else: 
     for i,c in enumerate(word1): 
      if c == char: 
       word2List[i] = c 



    # Converting list back to string 
    return ''.join(word2List) 

print(replace('p','apple','12345')) 

uscita:

1pp45 
Problemi correlati