我是编程新手,请耐心等待。我有一个关于循环以及如何检测变化的问题。我的列表例如是:
['09/2004', 297294186.0]
['09/2004', 257905788.0]
['09/2004', 768116019.0]
['09/2004', 458513425.0]
['08/2004', 251973518.0]
['08/2004', 265328010.0]
['08/2004', 330020350.0]
['08/2004', 383188410.0]
['08/2004', 487483400.0]
['08/2004', 800294431.0]
['08/2004', 999609680.0]
['08/2004', 1237831666.0]
['08/2004', 2242789646.0]
我想找到每个月的平均值。我知道如何找到它,但我能想到的唯一方法是
for i in list:
if month == '08'
do average
if month =='09'
do average
if month == '10'
do average
我有什么方法可以自动检测月份变化时的循环,执行当月的平均值,然后自动继续,而不是执行大量if命令?
非常感谢任何帮助
威廉
答案 0 :(得分:4)
你可以在几个月内制作一本字典:
from collections import defaultdict
months = defaultdict(list)
for date, number in data:
month, year = date.split('/')
months[month].append(number)
现在,months
看起来像{'08': [1, 2, 3, ...], '09': [5, 6, 7, ...]}
。从那里开始,计算平均值非常简单:
averages = {m: sum(months[m]) / len(months[m]) for m in months}
答案 1 :(得分:1)
使用itertools.groupby()
:
In [7]: from itertools import groupby
In [8]: lis=[['09/2004', 297294186.0],
['09/2004', 257905788.0],
['09/2004', 768116019.0],
['09/2004', 458513425.0],
['08/2004', 251973518.0],
['08/2004', 265328010.0],
['08/2004', 330020350.0],
['08/2004', 383188410.0],
['08/2004', 487483400.0],
['08/2004', 800294431.0],
['08/2004', 999609680.0],
['08/2004', 1237831666.0],
['08/2004', 2242789646.0]]
In [10]: from operator import itemgetter
In [11]: for k,g in groupby(lis,key=itemgetter(0)):
li=[x[1] for x in g]
print k,sum(li)/float(len(li))
....:
09/2004 445457354.5
08/2004 777613234.556
如果您的列表未排序,则需要使用groupby(sorted(lis),key=itemgetter(0))
。
答案 2 :(得分:0)
如果我理解正确,你想在列表中每月只做一次平均值吗? 我能想到的一种方法是分配标志。每个月都有一个带有标志的数组(例如,如果包含所有月份,则创建一个大小为12的布尔数组。这样每次都使用您读取的数字作为数组中的位置来检查平均值是否已经完成