2012-11-22 23 views
5

Ciao la mia domanda si riferisce ad un post molto tempo fa da qualche utente qui:pitone sostituzione elemento in lista

Find and replace string values in Python list

Per la mia situazione specifica. Ho una lista come questa:

appl = ['1', 'a', 'a', '2', 'a'] 

voglio sostituire solo il "un unico sconosciuto" istanza di "a" con solo uno spazio vuoto (che ricopre la carica di dove "a" usato per essere). Non sono sicuro di come farlo per un solo personaggio. Qualcuno può aiutare? Grazie in anticipo.

MODIFICA: i Dovrebbe menzionare che ho bisogno di utilizzare una funzione "indice" per individuare prima la "a" poiché è una variabile variabile. E poi ho bisogno del codice che sostituirà il personaggio.

EDIT2: molte persone presumono che l'indice sarà 2, ma voglio sottolineare che l'indice del personaggio non è noto. Anche "a" sarà presente nell'elenco circa ~ 20 volte (rimarrà un numero fisso) ma le loro posizioni cambieranno. Voglio sostituire un "a" in base all'input dell'utente. Questo è l'elenco effettivo con cui sto lavorando:

track [2] = ["|","@","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"," ","|"] 

@ è un messaggio di char, | è un bordo e "" è uno spazio vuoto. Un utente inserisce l'input per scegliere quanto @ si sposta verso destra e viene visualizzata una nuova immagine che mostra la nuova posizione di @ e la vecchia posizione di @ viene sostituita con uno spazio. La lunghezza dell'elenco rimane costante. Questo è il contesto della mia domanda.

risposta

2

È possibile utilizzare l'indice per raggiungere questo obiettivo, insieme a un ciclo. Ecco una piccola funzione per esso:

def replace_element(li, ch, num, repl): 
    last_found = 0 
    for _ in range(num): 
     last_found = li.index(ch, last_found+1) 
    li[li.index(ch, last_found)] = repl 

uso:

replace_element(appl, 'a', 2, ' ') 

Questo metodo è particolarmente bello perché getta il seguente errore quando il charactor non è nella lista:

ValueError: 'a' is not in list 
+2

Questo non è giusto ' 'appl.index ('a', 2)' 'significa iniziare nella posizione 2, non trovare la seconda occorrenza. – jterrace

+2

'appl.index ('a', 2) significa trovare il secondo indice di a'. No, non è così. Significa che la ricerca inizia dal carattere 2. – phihag

+1

@phihag ah mi spiace cervello scoreggia lì, grazie per la correzione. – Serdalis

1
appl = ['1', 'a', 'a', '2', 'a'] 
a_indices = [i for i, x in enumerate(appl) if x == 'a'] 

if len(a_indices) > 1: 
    appl[a_indices[1]] = ' ' 
+0

è anche per la seconda occorrenza? – SeesSound

3

È possibile trovare semplicemente l'indice della seconda occorrenza spostando l'elenco e memorizzando gli indici i cui elementi sono 'a' finché non avrete trovato due:

>>> appl = ['1', 'a', 'a', '2', 'a'] 
>>> idxs = (i for i,c in enumerate(appl) if c == 'a') 
>>> next(idxs) 
0 
>>> appl[next(idxs)] = '' 
>>> appl 
['1', 'a', '', '2', 'a'] 
1

In primo luogo, trovare la prima occorrenza del valore:

>>> appl = ['1', 'a', 'a', '2', 'a'] 
>>> first = appl.index('a') 
>>> first 
1 

per trovare la seconda, si avvia al primo posizione più uno:

>>> second = appl.index('a', first+1) 
>>> second 
2 

quindi impostare tale posizione per uno spazio come si vuole:

>>> appl[second] = ' ' 
>>> appl 
['1', 'a', ' ', '2', 'a'] 
0

Sembra che il tuo elenco (con "|", "@") sia breve e "@" sia sempre presente, solo in posizioni diverse.In questo caso è possibile sostituire la prima occorrenza di "@" nella lista appl in una sola riga:

appl[appl.index("@")] = " " 

Se la lista è grande e la voce potrebbe non essere presente:

i = next((i for i, x in enumerate(lst) if x == item), None) 
if i is not None: 
    lst[i] = replacement 
Problemi correlati