es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una mejor manera de obtener tuplas (clave, valorN) para un diccionario de Python que tiene una lista como valor?

Tengo un archivo de jsonlines que contiene elementos con ‘node’ como clave y como valor una lista de los otros nodos a los que está conectado.
Para agregar los bordes a un gráfico networkx, creo que se requieren tuplas de la forma (u, v).
Escribí una solución ingenua para esto, pero siento que podría ser un poco lenta para archivos jsonl lo suficientemente grandes. ¿Alguien tiene una solución mejor y más pythonica para sugerir?

dol = [{0: [1,2,3,4,5,6]},{1: [0,2,3,4,5,6]}]
for node in dol:
    #print(node)
    tpls = []
    key = list(node.keys())[0]
    tpls = [(key,v) for v in node[key]]
    print(tpls)

<iteramos a través de cada uno en la lista para agregarlos al gráfico>

[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6)]
[(1, 0), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6)]
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución más “pythonica” para agregar bordes a un grafo de networkx desde un archivo jsonl podría ser:

    1. Leer el archivo jsonl línea por línea utilizando el módulo jsonlines.
    2. Para cada línea, extraer los pares clave-valor y crear tuplas de la forma (nodo,nodo_conectado).
    3. Agregar todas las tuplas a una lista.
    4. Crear un objeto de grafo de networkx y utilizar el método add_edges_from() para agregar los bordes al grafo.

    Aquí tienes un código de ejemplo para el enfoque anterior:

    import jsonlines
    import networkx as nx
    
    # Abrir el archivo jsonl y leerlo línea por línea
    with open("file.jsonl", "r") as f:
        edges = []
        for line in jsonlines.Reader(f):
            node = list(line.keys())[0]
            for connected_node in line[node]:
                edges.append((node, connected_node))
    
    # Crear el objeto de grafo de networkx y agregar los bordes
    G = nx.Graph()
    G.add_edges_from(edges)
    

    Este enfoque evita iterar a través de cada diccionario en la lista y puede manejar archivos jsonl más grandes de manera eficiente.

Comments are closed.