如何將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)]
乖乖寫函數
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_listmy_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為什麼用不了?