2011-10-27 15 views
5

Ho bisogno di alcuni suggerimenti o un esempio, come posso localizzare in un elenco a l'elenco b, quindi sostituirlo con l'elenco c.Problema elenco Python

a=[1,3,6,2,6,7,3,4,5,6,6,7,8] 

ingresso nella lista b (questa è la sottolista il programma ricerca nella lista a).

b=[6,7] 

quando mi trovò tornare stati è stato trovato sottolista gli indici e sostituirlo ogni volta con c=[0,0], quindi il risultato sarà

[1,3,6,2,0,0,3,4,5,6,0,0,8] 

risposta

1

Vi do un esempio

li=[1,3,6,2,6,7,3,4,5,6,6,7,8] 
for i in range(len(li)): 
    if li[i:i + 2] == [3, 4]: 
     li[i:i + 2] = [0, 0] 

Penso che questo codice dovrebbe funzionare. Se vuoi uno script più robusto ti consiglio di controllare le occorrenze di una sottostringa nell'elenco originale e di modificarne una copia (per evitare comportamenti a effetto collaterale).

+1

Alcuni miglioramenti: utilizzando i nomi delle variabili usati dall'op, è possibile impostare l'intervallo come 'range (len (a) - len (b))'; il se "se a [i: i + len (b)] == b'; il compito 'a [i: i + len (b)] = c'. – jro

3

si può fare qualcosa di simile a (scritto in python 3.2, utilizzare xrange in Python 2.x):

for i in range(0, len(a)): 
    if a[i:i+len(b)] == b: 
     a[i:i+len(b)] = c 

questo rappresenterà per gli elenchi di tutte le dimensioni. Si presume che list b == list c non so se questo è ciò che si desidera, tuttavia, si prega di indicare se non lo è.

Uscita per le liste:

a = [1,2,3,4,5,6,7,8,9,0] 
b = [1,2] 
c = [0,0] 
Output: 
[0, 0, 3, 4, 5, 6, 7, 8, 9, 0] 
+0

oh wow non ho nemmeno visto una lista b, modifico la risposta. EDIT: e fatto – Serdalis

+0

Per i valori dati di 'a, b, c' forniti nella domanda, questo ora restituisce' a' come '[1, 3, 0, 0, 0, 0, 3, 4, 5, 6 , 0, 0, 8] ' – Johnsyweb

+1

Grazie per questo, mentre correggevo l'errore di allineamento ne ho causato un altro, il ciclo for stava solo testando il primo valore in assoluto, e ora ho trovato la soluzione che hai postato = d – Serdalis

4

Ecco un approccio più efficiente rispetto il mio primo, utilizzando l'elenco-slicing:

>>> for i in xrange(len(a) - len(b) + 1): 
...  if a[i:i+len(b)] == b: 
...   a[i:i+len(b)] = c 
... 
>>> a 
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8] 

Primo tentativo, per i posteri ....

Se non hai bisogno degli indici intermedi, ecco un approccio, utilizzando le funzioni stringa e adottando un metodo appropriato ch, non modificando la tua lista sul posto.

>>> a_as_str = ','.join(str(i) for i in a) 
>>> print a_as_str 
1,3,6,2,6,7,3,4,5,6,6,7,8 
>>> b_as_str = ','.join(str(i) for i in b) 
>>> b_as_str 
'6,7' 
>>> c_as_str = ','.join(str(i) for i in c) 
>>> c_as_str 
'0,0' 
>>> replaced = a_as_str.replace(b_as_str, c_as_str) 
>>> replaced 
'1,3,6,2,0,0,3,4,5,6,0,0,8' 
>>> [int(i) for i in replaced.split(',')] 
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8] 

Questo può essere riscritta come:

>>> def as_str(l): 
...  return ','.join(str(i) for i in l) 
... 
>>> def as_list_of_ints(s): 
...  return [int(i) for i in s.split(',')] 
... 
>>> as_list_of_ints(as_str(a).replace(as_str(b), as_str(c))) 
[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8] 
+0

@Downvoter, perché? – Johnsyweb

+2

La conversione da numeri interi a stringhe e viceversa è per me molto meno chiara rispetto alla ricerca diretta nell'elenco. Anche questo ha una penalità significativa nelle prestazioni (anche se potrebbe non essere rilevante in questo caso). – amicitas

+0

@amicitas: hai ragione ... Vedi modifica. – Johnsyweb

0

È importante anche considerare che cosa accade quando il modello dato viene creato dalla sostituzione.

penso che questa funzione dovrebbe trattare tutti i casi come previsto:

def replace(a, b, c): 
    ii = 0 
    while ii <= (len(a) - len(b) + 1): 
     print(ii) 
     if a[ii:ii+len(b)] == b: 
      a[ii:ii+len(b)] = c 
      ii += len(b) 
     else: 
      ii += 1 
    return a 


L'output utilizzando l'esempio originale:

[1, 3, 6, 2, 0, 0, 3, 4, 5, 6, 0, 0, 8] 


Ecco un esempio in cui la sostituzione crea la ricerca schema:

a = [1,1,1,1,1,1,1,1,1,6,6,7,7,1] 
b = [6,7] 
c = [0,6] 

uscita è come ci si aspetta:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 0, 6, 7, 1] 



Tutte le idee su come fare questo un po 'più conciso?