2011-10-27 12 views
5

Necesito algunas pistas o un ejemplo, ¿cómo puedo localizar en una lista a la lista b, luego reemplazarlo con la lista c.Python list issue

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

entrada de la lista b (esta es la lista secundaria el programa busca en la lista a).

b=[6,7] 

cuando me hallaron volver fueron la sublista se ha encontrado los índices y reemplazarlo cada vez con c=[0,0], por lo que el resultado será

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

Respuesta

1

Os pongo un ejemplo

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] 

Creo que este código debería funcionar. Si desea un script más robusto, le sugiero que verifique las ocurrencias de una subcadena en la lista original y edite una copia (para evitar comportamientos de efectos secundarios).

+1

Algunas mejoras: utilizando los nombres de variables utilizados por la op, puede hacer que el rango sea 'range (len (a) - len (b))'; el if 'if a [i: i + len (b)] == b'; la asignación 'a [i: i + len (b)] = c'. – jro

3

se puede hacer algo similar a (escrito en Python 3.2, utilice xrange en Python 2.x):

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

esto va a dar cuenta de las listas de todos los tamaños. Esto asume list b == list c No sé si eso es lo que quiere, sin embargo, indique si no es así.

de salida para las listas:

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 Ni siquiera vi una lista b, voy a editar la respuesta. EDITAR: y hecho – Serdalis

+0

Para los valores dados de 'a, b, c' provistos en la pregunta, esto ahora devuelve' a' como '[1, 3, 0, 0, 0, 0, 3, 4, 5, 6 , 0, 0, 8] ' – Johnsyweb

+1

Gracias por eso, mientras arreglaba el error de alineación causé otro, el bucle for solo estaba probando el primer valor, y ahora obtengo la solución que publicó = d – Serdalis

4

Aquí hay un enfoque más eficiente que la primera, utilizando la lista sobre el tramo:

>>> 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] 

primer intento, para la posteridad ....

Si no necesita los índices intermedios, aquí hay un enfoque, usando funciones de cuerda y tomando una aproximación funcional ch, no modificando su lista en el lugar.

>>> 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] 

Esto se puede refactorizar como:

>>> 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, ¿por qué? – Johnsyweb

+2

La conversión de enteros a cadenas y viceversa es para mí mucho menos clara que la búsqueda directa en la lista. También esto tiene una penalización de rendimiento significativa (aunque eso puede no ser relevante en este caso). – amicitas

+0

@amicitas: Tienes razón ... Ver edición. – Johnsyweb

0

Es importante también tener en cuenta lo que ocurre cuando el patrón dado se crea por la sustitución.

creo que esta función debe tratar a todos los casos según lo 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 


La salida utilizando el original ejemplo:

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


He aquí un ejemplo en el que la sustitución crea la búsqueda patrón:

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

de salida es el esperado:

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



Cualquier ideas sobre cómo hacer esto un poco más concisa?