Re: groupby behaviour

2013-02-26 Thread Ian Kelly
On Tue, Feb 26, 2013 at 9:27 AM, andrea crotti
andrea.crott...@gmail.com wrote:
 So I was trying to use groupby (which I used in the past), but I
 noticed a very strange thing if using list on
 the result:

As stated in the docs:


The returned group is itself an iterator that shares the underlying
iterable with groupby(). Because the source is shared, when the
groupby() object is advanced, the previous group is no longer visible.
So, if that data is needed later, it should be stored as a list:

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: groupby behaviour

2013-02-26 Thread andrea crotti
2013/2/26 Ian Kelly ian.g.ke...@gmail.com:
 On Tue, Feb 26, 2013 at 9:27 AM, andrea crotti
 andrea.crott...@gmail.com wrote:
 So I was trying to use groupby (which I used in the past), but I
 noticed a very strange thing if using list on
 the result:

 As stated in the docs:

 
 The returned group is itself an iterator that shares the underlying
 iterable with groupby(). Because the source is shared, when the
 groupby() object is advanced, the previous group is no longer visible.
 So, if that data is needed later, it should be stored as a list:
 
 --
 http://mail.python.org/mailman/listinfo/python-list


I should have read more carefully sorry, I was in the funny situation
where it would have actually worked in the production code but it was
failing in the unit tests (because I was using list only there).

It's very weird though this sharing and still doesn't really look
rightl, is it done just for performance reasons?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: groupby behaviour

2013-02-26 Thread Paul Rubin
andrea crotti andrea.crott...@gmail.com writes:
 It's very weird though this sharing and still doesn't really look
 rightl, is it done just for performance reasons?

It could consume unbounded amounts of memory otherwise.  E.g. if there
are millions of items in the group.

If you're not worried about that situation it's simplest to just
convert each group to a list for processing it:

   for k,g in groupby(...):
  gs = list(g)
  # do stuff with gs

calling list(g) reads all the elements in the group, advancing groupby's
internal iterator to the next group.  Since you've copied out all the
group elements, you don't have to worry about the sharing effect.
-- 
http://mail.python.org/mailman/listinfo/python-list