多维列表平坦化,其中子列表等于它们的平均值

2024-09-30 16:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我的列表=[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:])

Tags: 方法in列表forreturnifdeftype
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, 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]

相关问题 更多 >