2012-12-12 25 views
3

我有元組的一個長列表我需要排序例如。 [('11/2010', 196.9876),('11/2010', 654.9876), ('12/2010', 234.9876).........]我有一長串我需要排序的元組,例如。 [('12/2010' ,196.9876),( '12/2010',654.9876),('11/2010' ,234.9876).........]

我想使用的日期(1元)到組的第二個元素的元組到單獨的列表。到目前爲止,我已經得到了uniquedates的列表,例如[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

使用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

正如傑夫指出,在OP希望列出排序順序。比最後一行是:

result = [sorted(vals) for _, vals in sorted(d.iteritems(), key=lambda x : x[0])] 
+0

這聽起來不錯對我來說,但OP可能也希望按鍵排序。 – Geoff

+0

@Geoff,謝謝你指出。我更新了答案。 – StoryTeller

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 
>>> 
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']) 

dfDataFrame(即表)看起來像:

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 
+1

+1教我關於一個很酷的新圖書館 – StoryTeller

相關問題