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

Python 使多维列表平坦化,其中子列表等于其平均值,python,list,recursion,Python,List,Recursion,例如,我有一个列表=[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

例如,我有一个列表=[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:])
现在你可以说

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]

编辑:

如果您确实只需要一个函数:

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

这可能不是最好的解决方案,但您可以使用它帮助您的解决方案变得更好!我在每次递归调用中创建了两个列表,一个仅包含非列表的元素,另一个包含所有列表的元素(以防万一,您的格式类似于
[1,3,2,2,3,5,5]]]
)并创建了一个调用堆栈以获取每个内部数组中元素的总和,一个用于获取每个内部数组的长度,然后获取平均值。当然,由于阵列列表中可能有多个阵列,您可以为每个阵列映射相同的功能并累积其平均值

代码 结果
如何将列表平铺到[1,3]?我知道了我假设你知道如何计算平均值所以。。。请举一两个清楚的例子来说明你的意思。另外,请提供基本代码,用失败的方法重现问题。是否尝试创建一个包含所有嵌套数组平均值或类似值的数组?如果你让其他人来做,会有什么问题?@JonathanPortorreal因此每次函数运行时,原始列表[1、[2、[3、[5、[5]]]]都会缩短,因此会转到[1、[2、[3、[5]]]],然后[1、[2、[4]],然后[1、[3]],然后[1,3].@Prune请阅读我对乔纳森的回复。也是的,我知道如何取平均数。OPI中的另一个代码示例也有类似的解决方案,但我只需要一个函数。如果您对此有任何想法,我将不胜感激!
mean(flatten(l, reduce=mean))
>>> 2.0
def flatten(x, reduce=iter):
    return reduce(_flatten(x, reduce=reduce))
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]