Mi código funciona para una sola lista pero no para una lista anidada. Necesito mejorarlo en la funcionalidad.

Tengo una tarea que hacer. Descubrí cómo ejecutar lo que se requiere a mi manera, pero la solución es solo parcial. No funciona para una lista anidada. Estos son mis códigos.

def calc_averages(): allprices =[ ['', '', '', '', 1.0, 2.0, 1.2, 1.3, 1.1, '', '', ''], ['', '', '', 1.2, 1.0, 2.0, 1.2, 1.3, 1.1, '', '', ''], ['', '', '', 1.2, '', 1.8, 1.3, 1.1, '', '', '', ''], ['', '', '', '', 1.0, 2.0, 1.2, 1.2, '', '', '', ''], ['', '', '', '', 1.0, 2.0, 1.1, 1.2, 1.4, 1.8, 1.9, 2.2] ] averages = [] aList = [] for lst in allprices: aList.append(lst[5]) averages.append(sum(aList)/len(aList)) return averages 

Esto funciona bien para calcular el promedio de un mes, que es el total del 6º valor de cada lista dividido por 5. Sin embargo, cuando trato de calcular el promedio de los 12 meses usando el código anterior, no funciona a menos que cambiar esas cadenas vacías a 0s.

  ef calc_averages(): allprices =[ [0, 0, 0, 0, 1.0, 2.0, 1.2, 1.3, 1.1, 0, 0, 0], [0, 0, 0, 1.2, 1.0, 2.0, 1.2, 1.3, 1.1, 0, 0, 0], [0, 0, 0, 1.2, 0, 1.8, 1.3, 1.1, 0, 0, 0, 0], [0, 0, 0, 0, 1.0, 2.0, 1.2, 1.2, 0, 0, 0, 0], [0, 0, 0, 0, 1.0, 2.0, 1.1, 1.2, 1.4, 1.8, 1.9, 2.2] ] averages = [] aList = [] bList = [] cList = [] dList = [] eList = [] fList = [] gList = [] hList = [] iList = [] jList = [] kList = [] lList = [] for lst in allprices: aList.append(lst[0]) bList.append(lst[1]) cList.append(lst[2]) dList.append(lst[3]) eList.append(lst[4]) fList.append(lst[5]) gList.append(lst[6]) hList.append(lst[7]) iList.append(lst[8]) jList.append(lst[9]) kList.append(lst[10]) lList.append(lst[11]) averages.append(sum(aList)/len(aList)) averages.append(sum(bList)/len(bList)) averages.append(sum(cList)/len(cList)) averages.append(sum(dList)/len(dList)) averages.append(sum(eList)/len(eList)) averages.append(sum(fList)/len(fList)) averages.append(sum(gList)/len(gList)) averages.append(sum(hList)/len(hList)) averages.append(sum(iList)/len(iList)) averages.append(sum(jList)/len(jList)) averages.append(sum(kList)/len(kList)) averages.append(sum(lList)/len(lList)) return averages 

Cuando bash ejecutarlo con esas cadenas vacías, me da este error; TypeError: tipo (s) de operando no soportado para +: ‘int’ y ‘str’

También soy consciente de que no está escrito de buena manera. Si tienes alguna sugerencia de mejora por favor dime. Gracias ya 🙂

Su problema es que está intentando agregar una cadena y un int juntos.

En lugar de sum (aList) / len (aList), haría

 sum(list(filter(lambda x: x != '', aList)))/ len(aList) 

que elimina todos los caracteres vacíos de la lista.

Para envolver todo junto donde te limpie con varias listas:

 def main(): allprices =[['', '', '', '', 1.0, 2.0, 1.2, 1.3, 1.1, '', '', ''], ['', '', '', 1.2, 1.0, 2.0, 1.2, 1.3, 1.1, '', '', ''], ['', '', '', 1.2, '', 1.8, 1.3, 1.1, '', '', '', ''], ['', '', '', '', 1.0, 2.0, 1.2, 1.2, '', '', '', ''], ['', '', '', '', 1.0, 2.0, 1.1, 1.2, 1.4, 1.8, 1.9, 2.2]] alllists = [[allprices[i][j] for i in range(len(allprices))] for j in range(12)] averages = [] for alist in alllists: averages.append(sum(list(filter(lambda x: x != '', alist)))/ len(alist)) print(averages) main()