Python >> Tutorial de Python >  >> Python

Implementando un gráfico dirigido en python

Otra biblioteca que podría usar es NetworkX. Proporciona una implementación de gráficos dirigidos que proporcionan funciones para obtener bordes entrantes DiGraph.in_edges() y bordes salientes DiGraph.out_edges() para conjuntos arbitrarios de nodos. Las muestras de uso se proporcionan en la documentación vinculada, pero desafortunadamente no vi ningún detalle sobre la eficiencia o el tiempo de ejecución.


Scipy ofrece rutinas gráficas eficientes si le preocupa la eficiencia computacional o la computación científica:

http://docs.scipy.org/doc/scipy/reference/sparse.csgraph.html


Esto no responde a su pregunta gráfica, pero ciertamente puede implementar una lista 2D en Python sin tener que recurrir a listas de listas de al menos dos formas:

Simplemente puede usar un diccionario:

import collections
t = collections.defaultdict(int)

t[0, 5] = 9
print t[0, 5]

Esto también tiene la ventaja de que es escaso.

Para un enfoque más elegante, pero que requiere más trabajo, puede usar una lista 1d y calcular el índice usando las coordenadas 2D junto con la altura y el ancho de la tabla.

class Table(object):
    def __init__(self, width, height):
        self._table = [None,] * (width * height)
        self._width = width

    def __getitem__(self, coordinate):
        if coordinate[0] >= width or coordinate[1] >= height:
            raise IndexError('Index exceeded table dimensions')
        if coordinate[0] < 0 or coordinate[1] < 0:
            raise IndexError('Index must be non-negative')
        return self._table[coordinate[1] * width + coordinate[0]]

    def __setitem__(self, coordinate, value):
        if coordinate[0] >= width or coordinate[1] >= height:
            raise IndexError('Index exceeded table dimensions')
        if coordinate[0] < 0 or coordinate[1] < 0:
            raise IndexError('Index must be non-negative')
        self._table[coordinate[1] * width + coordinate[0]] = value


t = Table(10,10)
t[0, 5] = 9
print t[0, 5]