Me gustaría mantener el primer y último elemento de una lista, y excluir otros que cumplan con los criterios definidos sin usar un bucle. El primer y el último elemento pueden tener o no los criterios de eliminación de elementos.

Como un ejemplo muy básico,

aList = ['a','b','a','b','a']

[x for x in aList if x !='a']

Devuelve ['b', 'b']

Necesito ['a','b','b','a']

Puedo dividir el primer y el último valor y luego volver a concatenarlos, pero esto no parece muy pitónico.

2
Tony Laidig 13 ene. 2017 a las 23:49

4 respuestas

La mejor respuesta

Puede usar la asignación de rebanadas:

>>> aList = ['a','b','a','b','a']
>>> aList[1:-1]=[x for x in aList[1:-1] if x !='a'] 
>>> aList
['a', 'b', 'b', 'a']
8
dawg 13 ene. 2017 a las 20:59

Prueba esto:

>>> list_ = ['a', 'b', 'a', 'b', 'a']
>>> [value for index, value in enumerate(list_) if index in {0, len(list_)-1} or value == 'b']
['a', 'b', 'b', 'a']

Aunque, la comprensión de la lista se está volviendo difícil de manejar. Considere escribir un generador así:

>>> def keep_bookends_and_bs(list_):
...     for index, value in enumerate(list_):
...         if index in {0, len(list_)-1}:
...             yield value
...         elif value == 'b':
...             yield value
...
>>> list(keep_bookends_and_bs(list_))
['a', 'b', 'b', 'a']
0
Rajiv Bakulesh Shah 13 ene. 2017 a las 23:55

Aquí hay una lista de comprensión que explícitamente hace que el primer y el último elemento sean inmunes a la eliminación, independientemente de su valor:

>>> aList = ['a', 'b', 'a', 'b', 'a']
>>> [ letter for index, letter in enumerate(aList) if letter != 'a' or index in [0, len(x)-1] ]
['a', 'b', 'b', 'a']
4
jez 13 ene. 2017 a las 21:05

Sí, parece que las respuestas sugeridas de Dawg y Jez son las correctas, aquí. Dejando lo siguiente para la posteridad.


Hmmm, su entrada y salida de muestra no coinciden con lo que creo que es su pregunta, y es absolutamente pitónico usar el corte:

a_list = ['a','b','a','b','a']
# a_list = a_list[1:-1] # take everything but the first and last elements
a_list = a_list[:2] + a_list[-2:] # this gets you the [ 'a', 'b', 'b', 'a' ]
5
2ps 13 ene. 2017 a las 21:04