2017-03-19 1 views
0

J'essaye de faire une fonction qui prend une liste avec des éléments qui sont flottants ou une liste de flottants arbitrairement imbriqués, et retourne une liste de la même longueur avec chaque élément remplacé par sa moyenne.Trouver la moyenne de chaque élément dans une liste de listes arbitrairement imbriquées

ie. lst = [1,[2,[3,[4,[5]]]]] #average of lst[0] = 1 average of lst[1] = (((((4+5)/2)+3)/2)+2)/2 print(Avg(lst)) qui devrait imprimer [1,2.875] voici ce que je suis arrivé à ce jour:

def Avg(lst,n=1): 
    if lst = [] and n > 1: 
     return 0 
    elif lst = []: 
     return lst 
    elif type(lst) == float: 
     return lst 
    elif type(lst[0]) == float and n > 1: 
     return (lst[0] + Avg(lst[1:]))/len(lst) 
    elif type(lst[0]) == list: 
     total = 0 
     length = 0 
     for e in lst[0]: 
      total += Avg(e) 
      length += 1 
     return [total/length] + Avg(lst[1:]) 
    return [lst[0]] + Avg(lst[1:]) 

quelqu'un peut me diriger dans la bonne direction?

Répondre

0

J'ai choisi la route d'itération à travers les listes, et en utilisant la récursivité si l'élément courant était lui-même une liste. J'ai seulement vérifié pour float ou int pour déterminer si quelque chose était numérique, mais c'est facilement prolongé si besoin est puisqu'il est isolé dans une fonction.

Sans plus tarder:

def is_numeric(item): 
    return type(item) == float or type(item) == int 

def Avg(something): 
    if is_numeric(something): 
     return something 
    for i, element in enumerate(something): 
     if not is_numeric(element): 
      sub_element = Avg(element) 
      l = len(sub_element) 
      something[i] = sum(sub_element)/l if l > 0 else 0 
    return something 

print(Avg([1,[2,[3,[4,[5]]]]])) 

produit [1, 2.875].