2017-01-30 117 views
-6

我需要在这个例子中每n元素平均Python列表,n = 3Python的 - 平均每一个“N”列表中元素

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

从而使输出列表是:

list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8] 
+1

你尝试过一些事情吗? – MYGz

+0

显示编码尝试,所以在你的例子中'n'是3? –

+2

结果不应该是'[2,5,8]'? – wvdz

回答

1

可以计算[2,5,8]名单列表中的理解是这样的:

list1 = [1,2,3,4,5,6,7,8,9] 
n = 3 

list2 = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)] 

然后把它放回list1(保留大小)像你这样的要求是这样的:

for i in range(0,len(list1)): 
    list1[i] = list2[i//n] 

或与列表理解:

list1 = [list2[i//n] for i in range(len(list1))] 

最后编辑:找到了一个不错oneliner来总括起来:

import itertools 
list1 = list(itertools.chain.from_iterable([i]*n for i in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)])) 
+0

体面的答案,但它海事组织似乎可能太慷慨当OP没有做出任何努力时提供一个。此外它不是很清楚地板部门在这里最合适 –

+0

谢谢。我试图以单线方式做到这一点,但失败了。是的,第二部分可以通过其他方式完成。哦,找到一个单线程来完成所有的工作。 –

+0

谢谢@ Jean-FrançoisFabre!下次我会努力尝试自己的尝试! – bloomwoood

0

您可以使用numpy的意思为:

import numpy as np 
list1 = [1,2,3,4,5,6,7,8,9] 
np.mean(np.array(list1).reshape(-1, 3), axis=1) 
1
>>> n = 3 
>>> list1 = [1,2,3,4,5,6,7,8,9] 
>>> [avg for avg in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)] for j in range(n)] 
[2, 2, 2, 5, 5, 5, 8, 8, 8] 

不需要:-) itertools

说明:继拆分作业分成2个步骤;这有帮助吗?哪一部分仍不清楚?

>>> n = 3 
>>> list1 = [1,2,3,4,5,6,7,8,9] 
>>> averages = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)] 
>>> print("averages: ", averages) 
averages: [2, 5, 8] 
>>> list2 = [avg for avg in averages for j in range(n)] 
>>> print("list2: ", list2) 
list2: [2, 2, 2, 5, 5, 5, 8, 8, 8] 

UPDATE:做一个没有itertools一个班轮的另一种方式:

>>> list2 = sum(([a]*n for a in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]), []) 
[2, 2, 2, 5, 5, 5, 8, 8, 8] 

说明:由于之前我们计算的平均值。然后我们传播他们身边这样的:

>>> averages = [2, 5, 8] 
>>> list2 = sum(([a]*n for a in averages), []) ### see note [1] below 
>>> list2 
[2, 2, 2, 5, 5, 5, 8, 8, 8] 

这可以进一步解开这样的:

>>> all_items = list([a]*n for a in averages) 
>>> all_items 
[[2, 2, 2], [5, 5, 5], [8, 8, 8]] 
>>> sum(all_items, []) 
[2, 2, 2, 5, 5, 5, 8, 8, 8] 
>>> 

注[1]:中sum的第一个参数出现在第一次看要包含在不必要的往返括号......如果你这么认为,试着在没有它们的情况下运行它,看看会发生什么。

+0

小心解释它是如何工作的? – Pureferret

+0

@ Pureferret它没有工作;看到最新的尝试 –

+0

它仍然缺乏任何解释... – Pureferret

相关问题