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()