[Tutor] Tutor Digest, Vol 109, Issue 71

Mitya Sirenef msirenef at lightbird.net
Thu Apr 4 15:32:33 CEST 2013


On 03/20/2013 09:14 PM, Matthew Johnson wrote:
> I recently asked a question on SO: 
> http://stackoverflow.com/questions/15180767/subset-list-based-on-value-of-dictionary-element
>
> and got very confused when trying to generalise the answer.
>
> The problem is as follows:
>
> say i have this list, and would like to get the value at each date 
> that has the largest value for realtime_start (date) value.
>
> obs = [{'date': '2012-10-01',
> 'realtime_end': '2013-02-18',
> 'realtime_start': '2012-11-15',
> 'value': '231.751'},
>  {'date': '2012-10-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2012-12-19',
> 'value': '231.623'},
>  {'date': '2012-11-01',
> 'realtime_end': '2013-02-18',
> 'realtime_start': '2012-12-14',
> 'value': '231.025'},
>  {'date': '2012-11-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2013-01-19',
> 'value': '231.071'},
>  {'date': '2012-12-01',
> 'realtime_end': '2013-02-18',
> 'realtime_start': '2013-01-16',
> 'value': '230.979'},
>  {'date': '2012-12-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2013-02-19',
> 'value': '231.137'},
>  {'date': '2012-12-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2013-03-19',
> 'value': '231.197'},
>  {'date': '2013-01-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2013-02-21',
> 'value': '231.198'},
>  {'date': '2013-01-01',
> 'realtime_end': '9999-12-31',
> 'realtime_start': '2013-03-21',
> 'value': '231.222'}]
>
> maxDate = "2013-02-21"
>
> The answer suggested itertools, and it worked for the exact maxDate 
> that's above.
> However, when i move the date (say to "2013-01-21") it throws the error:
>
> ValueError: max() arg is an empty sequence.
>
> I can see from the list that there are elements
> that have realtime_start values that are lower than 2013-01-21 so this 
> is a bug.
>
> I have read the documents for itertools, but cannot quite work out 
> this groupby stuff.
>
> there's a snip of the SO solution below -- help understanding as well 
> as the bug fix would be much appreciated.
>
> thanks in advance,
>
> Matt Johnson


You should refer to my earlier answer using groupby -- where
I sorted the list before using groupby on it; you can read some
notes on this in python groupby documentation.

I'm not sure why you insist on using groupby for this problem.

I would also try to stay away from packing so much in a single
list comp as the SO answer does, and instead split things into
separate steps where each step is simple and clear, then
you'd be able to print out intermediate results and see what
exactly is happening.

  -m



-- 
Lark's Tongue Guide to Python: http://lightbird.net/larks/



More information about the Tutor mailing list