3

たとえば、並べ替える必要があるタプルの長いリストがあります。[('11/2010', 196.9876),('11/2010', 654.9876), ('12/2010', 234.9876).........]

日付 (1 番目の要素) を使用して、タプルの 2 番目の要素を個別のリストにグループ化したいと考えています。これまでのところ、一意の日付のリストを取得しており、[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 に答える