使多维列表平坦,其中子列表等于其平均值

时间:2017-03-07 18:31:15

标签: python list recursion

所以例如,我有list = [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:])

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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]