bug with itertools.groupby?

2009-10-06 Thread Kitlbast
Hi there,

the code below on Python 2.5.2:

from itertools import groupby

info_list = [
{'profile': 'http://somesite.com/profile1', 'account': 61L},
{'profile': 'http://somesite.com/profile2', 'account': 64L},
{'profile': 'http://somesite.com/profile3', 'account': 61L},
]

grouped_by_account = groupby(info_list, lambda x: x['account'])
for acc, iter_info_items in grouped_by_account:
print 'grouped acc: ', acc

gives output:

grouped acc:  61
grouped acc:  64
grouped acc:  61

am I doing something wrong?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: bug with itertools.groupby?

2009-10-06 Thread Kitlbast
Thanks guys!

Miss sorting when reading docs.. (

However, I just create simple "groupby":

def groupby(_list, key_func):
res = {}
for i in _list:
k = key_func(i)
if k not in res:
res[k] = [i]
else:
res[k].append(i)
return res

and it works 3 times faster then itertools.groupby for my example (for
tests I extend number of profiles)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: bug with itertools.groupby?

2009-10-06 Thread Kitlbast
On Oct 7, 3:04 am, Raymond Hettinger  wrote:
> On Oct 6, 4:06 pm, Kitlbast  wrote:
>
>
>
>
>
> > Hi there,
>
> > the code below on Python 2.5.2:
>
> > from itertools import groupby
>
> > info_list = [
> >     {'profile': 'http://somesite.com/profile1', 'account': 61L},
> >     {'profile': 'http://somesite.com/profile2', 'account': 64L},
> >     {'profile': 'http://somesite.com/profile3', 'account': 61L},
> > ]
>
> > grouped_by_account = groupby(info_list, lambda x: x['account'])
> > for acc, iter_info_items in grouped_by_account:
> >     print 'grouped acc: ', acc
>
> > gives output:
>
> > grouped acc:  61
> > grouped acc:  64
> > grouped acc:  61
>
> > am I doing something wrong?
>
> Try another variant of groupby() that doesn't require the data to be
> sorted:
>
>    http://code.activestate.com/recipes/259173/
>
> Raymond

I've checked few options of groupby() implementations

1. def groupby(_list, key_func):
res = {}
for i in _list:
k = key_func(i)
if k not in res:
res[k] = [i]
else:
res[k].append(i)
return res


2. def groupby(_list, key_func):
res = {}
[res.setdefault(key_func(i), []).append(i) for i in _list]
return res


second one with setdefault works little bit slower then (1), although
it use list comprehension
-- 
http://mail.python.org/mailman/listinfo/python-list