Any elegant way to construct the complete $k$-partite graph in Python?

geremy condra debatem1 at gmail.com
Mon Nov 23 21:10:37 EST 2009


On Mon, Nov 23, 2009 at 9:03 PM, geremy condra <debatem1 at gmail.com> wrote:
> On Mon, Nov 23, 2009 at 7:05 PM, Paul Miller
> <paul.w.miller.please.dont.spam.me at wmich.edu> wrote:
>> I was wondering if there were any neat tools (like for instance,
>> something from itertools) that would help me write the following function
>> more elegantly.  The return value should, of course, be the complete $k$-
>> partite graph $K_{n_1, n_2, \dots, n_k}$:
>>
>> def completeGraph (*ns):
>>    '''
>>    Returns the complete graph $K_{n_1, n_2, \dots, n_k}$ when passed
>>    the sequence \code {n_1, n_2, \dots, n_k}.
>>    '''
>>    if len (ns) == 1:
>>        return completeGraph ( * ([1] * ns[0]) )
>>    n = sum (ns)
>>    vertices = range (n)
>>    partition_indices = [sum (ns[:i]) for i in range (len (ns))]
>>    partite_sets = [vertices[partition_indices[i]:partition_indices[i+1]]
>> \
>>                    for i in range (len (partition_indices) - 1)]
>>    partite_sets.append (vertices[partition_indices [-1]:] )
>>
>>    edges = []
>>    for i in range (len (partite_sets)):
>>        for j in range (i + 1, len (partite_sets)):
>>            edges.extend ([ (u, v) for u in partite_sets [i] for v in \
>>                           partite_sets [j] ])
>>
>>    return graph.Graph (vertices = vertices, edges = edges)
>>
>> Many thanks!
>
> Graphine does this with the following:
>
> from base import Graph
>
> def K(n):
>        """Generates a completely connected undirected graph of size n.
>
>        The verticies are numbered [0, n).
>
>        The edges are named after the verticies they connect such that
>        an edge connected verticies 1 and 2 is named (1,2).
>        """
>        # create the graph
>        k = Graph()
>        # generate all the nodes
>        for i in range(n):
>                k.add_node(i)
>        # generate all the edges
>        for i in range(n):
>                for j in range(i+1, n):
>                        k.add_edge(i, j, (i,j), is_directed=False)
>        # return the graph
>        return k
>
>
> Disclaimer: I'm the author of graphine.
>
> Geremy Condra
>

Sorry, misread- to generate a k-partite graph, you'll need a bit
more legwork. Give me a bit and I'll add it to graphine.

Geremy Condra



More information about the Python-list mailing list