3

我有一长串需要排序的元组,例如。[('11/2010', 196.9876),('11/2010', 654.9876), ('12/2010', 234.9876).........]

我想使用 date(1st element) 将元组中的第二个元素分组到单独的列表中。到目前为止,我已经得到了一个唯一日期列表,例如[11/2010,12/2010....],我试图使用这些来引用更大的列表并进行数学计算,我想出了:

vol_new = []
for monthrow in unique_date_list: 
    for row in date_and_av_tup: 
        if monthrow == row[0]:
            vol_new.append(row[1])
            len_vol_new = len(vol_new) # finds the n of items in volume list
            my_vol_total_new = reduce(lambda y,x: x+y, vol_new) # adds everything in the volume list
            average_vol_new = float(my_vol_total_new) / float(len_vol_new) #stores the average volume in a list

print average_vol_new

这可能是真正的垃圾代码,但我是编码新手,尝试这样做非常沮丧,感谢提供的任何帮助。

PS我正在使用Python

4

3 回答 3

6

您可能会发现pandas数据分析库对此非常有用,可用于创建可以轻松执行这些功能的表。例如:

import pandas as pd

months = [('11/2010', 196.9876),('11/2010', 654.9876), ('12/2010', 234.9876)]
df = pd.DataFrame(months, columns=['Month', 'Value'])

df是一个DataFrame(即一个表),它看起来像:

    Month   Value
0    11/2010     196.9876
1    11/2010     654.9876
2    12/2010     234.9876

您可以使用以下方法获取平均值和总数groupby

[7]:  df.groupby('Month').mean()
Out[7]:         Value    
        Month   
        11/2010  425.9876
        12/2010  234.9876

In [8]: df.groupby('Month').sum()
Out[8]:          Value
        Month   
        11/2010  851.9752
        12/2010  234.9876
于 2012-12-12T12:42:10.003 回答
4

使用 defaultdict 进行分组。

from collections import defaultdict
d = defaultdict(list)
for date, val in unique_date_list:
    d[date].append(val)
result = d.items()

编辑

重读您的问题后,我看到您只需要根据日期分组的值,而不需要日期。在这种情况下,我示例中的最后一行将是

result = d.values()

编辑 2

正如 Geoff 指出的那样,OP 希望列表按排序顺序排列。最后一行将是:

result = [sorted(vals) for _, vals in sorted(d.iteritems(), key=lambda x : x[0])]
于 2012-12-12T12:31:23.397 回答
3

尝试以下实现

somelist = [('11/2010', 196.9876),('11/2010', 654.9876), ('12/2010', 234.9876)]
#Create a defaultdictionary
somedict = defaultdict(list)
#and append the tuples as key value pair to it
#note the values would be augmented as a list
for k, v in somelist:
    somedict[k].append(v)

#Now sort the generated expression which creates a tuple pair of sorted values  
sorted((k, sorted(v)) for k, v in somedict.iteritems())
[('11/2010', [196.9876, 654.9876]), ('12/2010', [234.9876])]

当您处理大量列表时,您可能有兴趣了解性能。这是酸性测试

>>> def foo(lst):
    somedict = defaultdict(list)
    for k, v in lst:
        somedict[k].append(v)
    sorted((k, sorted(v)) for k, v in somedict.iteritems())
>>> somelist = [(random.randint(1,10),random.randint(1,1000)) for _ in range(1000000)]
>>> len(somelist)
1000000
>>> timeit.timeit("foo(somelist)",setup="from __main__ import foo, somelist",number=1)
0.9819706362000886
>>> 
于 2012-12-12T12:36:33.593 回答