Jal
Jal

Reputation: 215

Apparently empty groups generated with itertools.groupby

I have some troubles with groupby from itertools

from itertools import groupby

for k, grp in groupby("aahfffddssssnnb"):
    print(k, list(grp), list(grp))

output is:

    a ['a', 'a'] []
    h ['h'] []
    f ['f', 'f', 'f'] []
    d ['d', 'd'] []
    s ['s', 's', 's', 's'] []
    n ['n', 'n'] []
    b ['b'] []

It works as expected. itertools._grouper objects seems to be readable only once (maybe iterators ?)

but:

li = [grp for k, grp in groupby("aahfffddssssnnb")]
list(li[0])

[]

list(li[1])

[]

It seems empty ... I don't understand why ? This one works:

["".join(grp) for k, grp in groupby("aahfffddssssnnb")]

['aa', 'h', 'fff', 'dd', 'ssss', 'nn', 'b']

I am using version 3.9.9 Question already asked to newsgroup comp.lang.python without any answsers

Upvotes: 0

Views: 202

Answers (1)

Bharel
Bharel

Reputation: 26900

grp is a sub-iterator over the same major iterator given to groupby. A new one is created for every key.

When you skip to the next key, the old grp is no longer available as you advanced the main iterator beyond the current group.

It is stated clearly in the Python documentation:

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:

k, g in groupby(data, keyfunc):
   groups.append(list(g))      # Store group iterator as a list
   uniquekeys.append(k)

Upvotes: 2

Related Questions