2012-04-10 15 views
9

Tengo una lista simple, siempre consecutivos ordenados así:¿Cómo elimino un rango (subsección) de una lista en Python?

all = [ 1, 2, 3, 4, 5, 6 ] # same as range(1, 7) 

también tienen current = 4. Al final quiero la lista all a este aspecto

altered = [ 1, 2, 5, 6 ] 

Así que lo que ocurrió fue que se elimine el número current y la anterior3.

current también puede ser 1 y 0, por lo que quiero asegurarme de que no arroje un error para esos dos valores.

Para la excepción current = 0, la lista es alterada como esto

altered = [ 1, 2, 3, 4, 5 ] 

Lo que significa que current = 0 simplemente elimina el último número.

Creo que probablemente pueda codificar algo elegante con generadores, pero me da pena escribirlos.

¡Gracias de antemano!

Puntos de bonificación por hacer esto en una sola línea. Si el current = 0 es demasiado problema, entonces también podría ser current = -1 o current = 7.

EDIT: Asegúrese de comprobar si hay current = 1, que debe ser

altered = [ 2, 3, 4, 5, 6 ] 
+0

Cuando == corriente 4 es el 4 eliminado de la lista, ya que tiene el valor de 4 o porque está en la cuarta posición (cuando se cuenta desde uno)? Del mismo modo, ¿se eliminó el 3 porque es el número más pequeño menor que 4, o porque está en el índice que precede al elemento eliminado? – thebjorn

+0

La lista siempre es un 'rango()' por lo que no importa si lo mira como una posición o valor. – hobbes3

+2

No llame a sus listas 'all' ya que hay una función incorporada' all() 'y eso elimina el acceso una vez que usa el nombre. – jamylak

Respuesta

9
all = all[:max(current - 2, 0)] + all[current:] 

o

del all[max(current - 2, 0):current] 
+0

No funcionará para 'current = 1' – hobbes3

+0

¿funciona ahora? – Doboy

+0

¡Agradable! Esto también funciona para 'current = 7'. ¿Es posible hacerlo para que elimine el último número para 'current = 0'? ¡Entonces será perfecto! – hobbes3

1

Que este trabajo?

>>> all = range(1, 7) 
>>> new = all[:2]+all[4:] 
>>> print new 
[1, 2, 5, 6] 
0
>>> all = range(1,7) 
>>> current = 4 
>>> [item for item in all if item != current and item != current-1] 
[1, 2, 5, 6] 
>>> current = 0 
>>> [item for item in all if item != current and item != current-1] 
[1, 2, 3, 4, 5, 6] 
+0

BTW Esto mantiene la lista original inalterada. – huggie

+1

'current = 0' debe eliminar el valor final' 6' como ** hobbes3 ** mencionado – FallenAngel

+0

Creo que esto debería funcionar, pero no para 'current = 0' :-(' [item for item in all if item! = current y item! = current-1 o current == 0 y item!= len (all)] ' – hobbes3

1
all[:max(current-2,0)] + all[max(current,0):][:-1] + all[-1:]*(0 < current < len(all)) 
Cuestiones relacionadas