Grouping pairs - suggested tools

Arnaud Delobelle arnodel at gmail.com
Wed Sep 22 04:29:53 EDT 2010


On Sep 22, 8:30 am, Peter Otten <__pete... at web.de> wrote:
> Arnaud Delobelle wrote:
> > I think I would go for the two-step approach of constructing the graph
> > first and then recursively building connected components.  It sounds
> > more complicated at first but when you implement it it turns out quite
> > simple:
>
> > from collections import defaultdict
> > from itertools import count
>
> > def build_groups(edges):
> >     neighbors = defaultdict(set)
> >     for x, y in edges:
> >         neighbors[x].add(y)
> >         neighbors[y].add(x)
>
> >     groups, group_indices = {}, count(1)
> >     def set_group(x, group_index):
> >         groups[x] = group_index
> >         for y in neighbors[x]:
> >             if y not in groups:
> >                 set_group(y, group_index)
>
> >     for x in neighbors:
> >         if x not in groups:
> >             set_group(x, group_indices.next())
> >     return groups
>
> That looks a little less like legwork than mine. My only objection is that
> you may hit Python's low recursion limit.
>
> Peter

True.  One could setrecursionlimit() temporarily to work around this.
Or here is an alternative set_group() function:

def set_group(x, group_index):
    group = [x]
    for y in group:
        groups[y] = group_index
        group.extend(z for z in neighbors[y] if z not in groups])

It's untested!

--
Arnaud



More information about the Python-list mailing list