Eliminar cadena vacía de la lista

Acabo de comenzar las clases de Python y realmente necesito ayuda. Por favor, tenga en cuenta que soy nuevo si está respondiendo esto.

Tengo que hacer un progtwig que tome el promedio de todos los elementos en una lista determinada “l”. Esa es una función bastante fácil por sí misma; el problema es que el profesor quiere que eliminemos cualquier cadena vacía presente en la lista antes de hacer el promedio.

Entonces, cuando reciba la lista [1,2,3,'',4] quiero que la función ignore el '' para el promedio, y simplemente tome el promedio de los otros 4 / len (l). Puede alguien ayudarme con esto?

¿Tal vez un ciclo que sigue comparando una cierta posición de la lista con el '' y elimina esas de la lista? Lo he intentado pero no funciona.

Puede usar una lista de comprensión para eliminar todos los elementos que son '' :

 mylist = [1, 2, 3, '', 4] mylist = [i for i in mylist if i != ''] 

Luego, puede calcular el promedio tomando la sum y dividiéndola por el número de elementos en la lista:

 avg = sum(mylist)/len(mylist) 

Promedio de punto flotante (asumiendo python 2)

Dependiendo de su aplicación, puede querer que su promedio sea un flotador y no un int. Si ese es el caso, convierta uno de estos valores a un flotador primero:

 avg = float(sum(mylist))/len(mylist) 

Alternativamente, puedes usar la división de python 3:

 from __future__ import division avg = sum(mylist)/len(mylist) 

Puedes usar el filter() :

filter() devuelve una list en Python 2 si le pasamos una lista y un iterator en Python 3. Como lo sugiere @PhilH, puede usar itertools.ifilter() en Python 2 para obtener un iterador.

Para obtener una lista como salida en Python 3 use list(filter(lambda x:x != '', lis))

 In [29]: lis = [1, 2, 3, '', 4, 0] In [30]: filter(lambda x:x != '', lis) Out[30]: [1, 2, 3, 4, 0] 

Nota para filtrar cualquier valor falso, simplemente puede usar el filter(None, ...) :

 >>> lis = [1, 2, 3, '', 4, 0] >>> filter(None, lis) [1, 2, 3, 4] 

Las otras respuestas le muestran cómo crear una nueva lista con el elemento deseado eliminado (que es la forma habitual de hacerlo en python). Sin embargo, hay ocasiones en las que desea operar en una lista en su lugar – Aquí hay una manera de hacerlo en la lista en su lugar:

 while True: try: mylist.remove('') except ValueError: break 

Aunque supongo que se podría argumentar que podría hacer esto con la asignación de sectores y una comprensión de lista:

 mylist[:] = [i for i in mylist if i != ''] 

Y, como algunos han planteado cuestiones sobre el uso de la memoria y las maravillas de los generadores:

 mylist[:] = (i for i in mylist if i != '') 

trabaja tambien

 itertools.ifilterfalse(lambda x: x=='', myList) 

Esto utiliza iteradores, por lo que no crea copias de la lista y debería ser más eficiente tanto en tiempo como en memoria, lo que lo hace robusto para listas largas.

JonClements señala que esto significa realizar un seguimiento de la longitud por separado, para mostrar ese proceso:

 def ave(anyOldIterator): elementCount = 0 runningTotal = 0 for element in anyOldIterator: runningTotal += element elementCount += 1 return runningTotal/elementCount 

O mejor

 def ave(anyOldIterator): idx = None runningTotal = 0 for idx,element in enumerate(anyOldIterator): runningTotal += element return runningTotal/(idx+1) 

Reducir:

 def ave(anyOldIterator): pieces = reduce(lambda x,y: (y[0],x[1]+y[1]), enumerate(anyOldIterator)) return pieces[1]/(pieces[0]+1) 

El tiempo en el promedio del rango (0,1000) ejecutado 10000 veces le da a la lista la comprensión de un tiempo de 0.9 y la versión reducida 0.16. Así que ya es 5 veces más rápido antes de agregar filtros.

Puedes usar:

 alist = ['',1,2] new_alist = filter(None, alist) new_alist_2 = filter(bool, alist) 

Resultado:

 new_alist = [1,2] new_alist_2 = [1,2] 
 mylist = [1, 2, 3, '', 4] newlist = [] for i in mylist: try: newlist.append(int(i)) except ValueError: pass avg = sum(newlist)/len(newlist) 

” es equivalente a Falso. Si filtramos el caso 0 (porque 0 es equivalente a Falso), podemos usar la comprensión de lista:

 [x for x in a if x or x == 0] 

O si queremos estrictamente filtrar las cadenas vacías :

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

Esta puede no ser la forma más rápida.

Edit , agregó algunos resultados de banco comparando con las otras soluciones (no por el hecho de compararme con otros, pero también sentía curiosidad por saber qué método era el más rápido)

 ragsagar> 6.81217217445 pistache> 1.0873541832 cerealy> 1.07090902328 Matt> 1.40736508369 Ashwini Chaudhary> 2.04662489891 Phil H (just the generator) > 0.935978889465 Phil H with list() > 3.58926296234 

Hice el script rápidamente, usando timeit (), usé [0,1,2,0,3,4,'',5,8,0,'',4] como la lista. Realicé múltiples pruebas, los resultados no variaron.

NOTA: No estoy tratando de poner mi solución en la cima usando la velocidad como criterio. Sé que OP no pidió específicamente la velocidad, pero tenía curiosidad y tal vez algunos otros lo son.