2

我对编程完全陌生,请多多包涵。我有一个关于循环和如何检测变化的问题。例如,我的清单是:

['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 命令?

任何帮助深表感谢

威廉

4

3 回答 3

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}
于 2012-12-23T11:42:42.013 回答
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)).

于 2012-12-23T11:46:54.423 回答
0

如果我理解正确,您只想在列表中每月平均一次?我能想到的一种方法是分配标志。每个月都有一个带有标志的数组(例如,如果包含所有月份,则创建一个大小为 12 的布尔数组。这样每次都使用您读取的数字作为数组中的位置来检查平均值是否已完成

于 2012-12-23T11:45:28.783 回答