所以例如,我有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:])
答案 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]