Grouping pairs - suggested tools
MRAB
python at mrabarnett.plus.com
Wed Sep 22 13:06:17 EDT 2010
On 20/09/2010 22:42, Astley Le Jasper wrote:
> I have a list of tuples that indicate a relationship, ie a is related
> to b, b is related to c etc etc. What I want to do is cluster these
> relationships into groups. An item will only be associated with a
> single cluster.
>
> Before I started, I wondered if there was any particular tool within
> Python I should be looking at. I don't expect anyone to code this for
> me, just say ... "you need to look at using x". I was going to use
> populate a dictionary and
>
> Sorry for being so vague.
>
[snip]
I thought I'd join in. I've used repr to ensure that I have something
that's hashable:
def show_groups(pairs):
groups = {}
items = {}
for x, y in pairs:
x_repr, y_repr = repr(x), repr(y)
items[x_repr] = x
items[y_repr] = y
x_group = groups.setdefault(x_repr, set([x_repr]))
y_group = groups.setdefault(y_repr, set([y_repr]))
union = set()
for m in x_group | y_group:
union |= groups[m]
for m in union:
groups[m] = union
indexes = {}
for s in groups.values():
indexes.setdefault(frozenset(s), len(indexes) + 1)
indexes = sorted(indexes.items(), key=lambda pair: pair[1])
for s, i in indexes:
for m in sorted(s):
print("{0} {1}".format(i, items[m]))
if __name__ == "__main__":
edges = [
('a', 'b'),
('a', 'c'),
('a', 'd'),
('b', 'c'),
('b', 'd'),
('c', 'd'),
('e', 'f'),
('e', 'g'),
('f', 'g'),
('h', 'i'),
]
show_groups(edges)
print()
show_groups([('a', 'c'), ('b', 'd'), ('c', 'd')])
More information about the Python-list
mailing list