2012-12-12 4 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() 

Edit 2

Как Geoff отметил, что ОП хотел списки в отсортированном порядке. Чем последней строки будет:

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

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

+1 за то, что вы узнали о новой прохладной библиотеке – StoryTeller

 Смежные вопросы

  • Нет связанных вопросов^_^