如何將python list中每12項的平均值組成一個新的list?

假設list中有1008個item,將1-12項的平均值組成一項,13-24項的平均值組成一項,以此類推,最後新列表中就有84個item。


from more_itertools import chunked
[sum(x) / len(x) for x in chunked(L, 12)]

不要造輪子:API Reference


乖乖寫函數

def isplit_by_n(ls, n):
for i in range(0, len(ls), n):
yield ls[i:i+n]

def split_by_n(ls, n):
return list(isplit_by_n(ls, n))

不要為了短小而短小...

短小的代碼可以看 H-99: Ninety-Nine Haskell Problems 這裡的


就這5行代碼也要問知乎。。。


設list是my_list

my_list中前12項是my_list[0:12]

my_list的12到24項是my_list[12:24]

my_list的12k到12k + 12項是my_list[12 * k : 12 * k + 12]

求平均值可以用sum(my_list[12 * k : 12 * k + 12]) / float(len(my_list[12 * k : 12 * k + 12]))

所以合起來就是

[sum(my_list[k : k + 12])
/ float(len(my_list[k : k + 12]))
for k in range(0, len(my_list), 12)]

也可以寫成

[sum(x) / float(len(x))
for x in (my_list[k : k + 12]
for k in range(0, len(my_list), 12))]


@依雲 大神已經說了一個很好的辦法了,贅述一個

import numpy as np

a = np.array(L).reshape((12,-1))

avg = np.mean(a,axis=0)

最後結果avg可能不太符合要求,但繼續做數據分析應該更加方便和快捷

--20161018補充

L大概是這樣的:

N=1000000

L = range(12*N)

#不要問我為什麼做這麼大的list,太小了運行時間沒法比較

依雲的運行時間大概是0:00:01.020000

我的運行時間大概是0:00:01.729000

表示很受傷……


[sum(nums[i*12:(i+1)*12])/12 for i in xrange(len(nums)/12)]


listA=range(1,1009)

print([float(sum(listA[i:i+12])/12) for i,num in enumerate(listA) if i%12==0])


我看了一眼問題,第一個反應是「咦,這不是用個 partition 函數就行了嗎?」然後才發現,是在問 Python 的代碼……

腦子裡一開始蹦出來的就是這段 clojure 代碼(ry

(map #(/ (apply + %) (count %)) (partition 12 (take 24 (cycle [1 2 3 4]))))


ans = [sum(L[i : i + 12]) / 12.0 for i in xrange(0, len(L), 12)]

循環遍歷下標數組[0, 12, 24, ...],對於每一個下標數組中的元素i,計算sum(L[i : i + 12]) / 12.0,將這些結果組成一個新的數組,就是所要求的答案。

這裡可能有一個陷阱,就是L的長度不為12的整數倍,這個時候由於Python切片對邊界情況的容錯性,sum(L[i : i + 12])是沒有錯的,但是分母不應該是12.0,而是min(len(L) - i * 1.0, 12.0)

注意當L中的元素都是整型時,12.0不能寫作12,否則除法會造成截斷;這也是min(len(L) - i * 1.0, 12.0)中存在兩個『.0』的原因。


推薦閱讀:

python和C#結合的效果如何?是否能讓C#寫的程序調用python的庫?
自學python遇到如下問題如何解決?(主要有關模塊安裝的問題)
Python 用 * (重複運算符) 和迭代器生成 list 有何不同?
學習python有什麼用?python的實際應用有哪些?
Python為什麼用不了?

TAG:Python | Python入門 |