我需要在這個例子中每n
元素平均Python列表,n = 3
:Python的 - 平均每一個「N」列表中元素
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
從而使輸出列表是:
list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]
我需要在這個例子中每n
元素平均Python列表,n = 3
:Python的 - 平均每一個「N」列表中元素
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
從而使輸出列表是:
list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]
可以計算[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)]))
體面的答案,但它海事組織似乎可能太慷慨當OP沒有做出任何努力時提供一個。此外它不是很清楚地板部門在這裏最合適 –
謝謝。我試圖以單線方式做到這一點,但失敗了。是的,第二部分可以通過其他方式完成。哦,找到一個單線程來完成所有的工作。 –
謝謝@ Jean-FrançoisFabre!下次我會努力嘗試自己的嘗試! – bloomwoood
借用了一下從@Jean-François Fabre's answer但使用statistics.mean
(avaiable for python 3.4+):
>>> from statistics import mean
>>> from itertools import chain
>>> lst = [1,2,3,4,5,6,7,8,9]
>>> n = 3
>>> list(chain.from_iterable([mean(lst[i:i+n])]*n for i in range(0,len(lst),n)))
[2, 2, 2, 5, 5, 5, 8, 8, 8]
您可以使用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)
>>> 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
的第一個參數出現在第一次看要包含在不必要的往返括號......如果你這麼認爲,試着在沒有它們的情況下運行它,看看會發生什麼。
你嘗試過一些事情嗎? – MYGz
顯示編碼嘗試,所以在你的例子中'n'是3? –
結果不應該是'[2,5,8]'? – wvdz