2017-03-07 52 views
2

因此,例如,我有列表= [1,[2,[3,[5,[5]]]]]結果列表將是[ 1,3]。使多維列表平坦,其中列表等於其平均值

我現在有這個,

def avg(mylist): 
    if mylist == []: 
     return mylist 
    elif type(mylist[0]) == list: 
     mylist[0] = 0 # average of mylist[0] 
     return mylist[:1]+avg(mylist[1:]) 
    elif type(mylist[0]) == float: 
     return mylist[:1]+avg(mylist[1:]) 

其中一期工程,我希望它太的方式,但我不能找到一種方法來設置MYLIST [0] = MYLIST [0]的平均水平。我也嘗試了很多不同的方法,但我找不到一個可行的方法。

編輯:我試過的東西的另一個例子。

total = 0 
nosublist=True 
if mylist == []: 
    return mylist 
for x in mylist: 
    if type(x) == list: 
     nosublist=False 
if nosublist: 
    return mylist[:1]+average(mylist[1:]) 
elif not nosublist: 
    for x in mylist: 
     if type(x) == list: 
      total += average(x) 
     else: 
      total += x 
    mylist[0] = total/len(mylist) 
    return average(mylist[:1])+average(mylist[1:]) 
+0

如何列表平爲[1,3]?我確實知道了 – galaxyan

+2

我假設你知道如何計算平均值,所以...請給出一個明確的例子或兩個你的意思。另外,請提供基本代碼,以用您的一種失敗方法重現問題。 – Prune

+0

您是否嘗試創建所有嵌套數組平均值或類似的數組?如果你要求其他人這樣做會出現什麼問題? –

回答

1

這可能不是最好的解決方案,但你可以用它來幫助你更好!我在每次遞歸調用時創建了兩個列表,其中一個元素不是列表,另一個元素是列表(僅當您的格式爲[1, 3, [2], [2], [3, [5, [5, 5]]]]時創建了一個列表,並創建了調用堆棧以獲取元素的總和在每個內部陣列和一個取得每個內部陣列的長度,然後取平均值。當然,由於數組列表中可能有多個數組,因此您可以爲每個數組映射相同的功能並累積他們的平均值。

代碼
list1 = [1, [2, [3, [5, [5]]]]] 
list2 = [1, [2, 3], [4, 5], [5, [3, 4]]] 


def avg(mylist): 
"""flattens an array where the sublists to flatten are the average of that sublist""" 

    subarrays = filter(lambda x: type(x) == type([]), mylist) 
    rootelems = filter(lambda x: type(x) != type([]), mylist) 

    avg_all = lambda elem: sum((avg(elem)))/len(avg(elem)) 

    if subarrays == []: 
    return mylist 

    return rootelems + map(avg_all, subarrays) 

print avg(list1) 
print avg(list2) 

結果
[1, 3] 
[1, 2, 4, 4] 
2
def isiter(x): 
    try: 
     iter(x) 
     return True 
    except TypeError: 
     return False 


def _flatten(x, reduce=iter): 
    for i in x: 
     if isiter(i): 
      r = reduce((j for j in _flatten(i, reduce=reduce))) 
      if isiter(r): 
       yield from r 
      else: 
       yield r 
     else: 
      yield i 

現在,您可以插件意味着

def mean(x): 
    l = list(x) 
    return sum(l)/len(l) 

l = [1, [2, [3, [5, [5]]]]] 

list(_flatten(l, reduce=mean)) 
>>> [1, 3.0] 

mean(flatten(l, reduce=mean)) 
>>> 2.0 

編輯:

如果你真的只需要一個單一的功能:

def flatten(x, reduce=iter): 
    return reduce(_flatten(x, reduce=reduce)) 
+0

我有一個類似的解決方案,但我只需要一個函數的方式。如果您對此有任何想法,我將不勝感激! –

+0

上次編輯看起來非常好 –