Tengo un archivo de texto que dice:

a;b  
a;c  
a;d  
b;h  
c;e  
e;f  
e;g  
e;j  
f;b  
g;d  
h;b  
h;e  
i;d  
i;e  

Pero cuando lo imprimo después de convertirlo en un diccionario

def read_graph(file_name):                                                                      
  graph = {}                                                                                      
  for line in open(file_name):
    if ";" in line:
        key, val = map(str.strip, line.split(";"))
        graph[key] = val
  return dict(sorted(graph.items())))

Imprime:

{'a': 'b', 'b': 'd', 'c': 'e', 'd': 'g', 'e': 'd', 'f': 'd'}

¿Cómo lo hago donde imprime las teclas que se repiten?

0
user12166681 5 oct. 2019 a las 02:28

4 respuestas

La mejor respuesta

Supongo que para esto querrá usar una lista de cadenas en lugar de una sola cadena como valor, de lo contrario, su diccionario seguirá reemplazando el valor de la misma clave.

En lugar de:

{'a': 'b'}

Probablemente desee una estructura como:

{'a': ['b','c','d']}

Usando su función:

def read_graph(file_name):                                                                      
  graph = {}                                                                                      
  for line in open(file_name):
    if ";" not in line: continue
    key, val = line.strip().split(';')
    if key not in graph: graph[key] = list()
    if val not in graph[key]: graph[key].append(val)
  return dict(sorted(graph.items()))


read_graph('file.txt')
{'a': ['b', 'c', 'd'], 'c': ['e'], 'b': ['h'], 'e': ['f', 'g', 'j'], 'g': ['d'], 'f': ['b'], 'i': ['d', 'e'], 'h': ['b', 'e']}
0
David542 4 oct. 2019 a las 23:41

Como parece estar trabajando con una estructura gráfica, le recomendaría que mire el NetworkX paquete para Python. Tienen estructuras de datos gráficas preconstruidas para su uso y muchos algoritmos que pueden operar en ellas.

import networkx as nx

graph = nx.Graph()
with open(file_name) as f:  # This closes the file automatically when you're done
    for line in f:
        if ";" in line:
            source, dest = map(str.strip, line.split(";"))
            graph.add_edge(source, dest)

En caso de que aún quiera usar Vanilla Python solamente:

Los diccionarios de Python solo pueden tener un valor por clave. Para almacenar múltiples valores para una sola clave, debe almacenar sus claves en una lista de valores.

my_dict = {
    'a': ['b', 'c', 'd'],
    'b': ['h'],
    ...
}
0
Energya 4 oct. 2019 a las 23:37

No puede porque es un diccionario y no está permitido tener dos claves iguales o sería ambiguo. Puede agrupar por clave.

def read_graph(file_name):                                                                      
  graph = {}                                                                                      
  for line in open(file_name):
    if ";" in line:
        key, val = map(str.strip, line.split(";"))
        if key not in graph:
            graph[key] = [val]
        else:
            graph[key].append(val)
  return dict(sorted(graph.items())))

Así que ahora tiene para cada clave, una matriz con sus valores.

0
Tomás Denis Reyes Sánchez 4 oct. 2019 a las 23:36

Los diccionarios en python (y en cualquier otro idioma que conozca) tienen valores únicos para cada clave, y los sobrescribirán cuando ingrese un nuevo valor para una clave existente.

Considere un tipo diferente de estructura de datos, como un conjunto de tuplas, p.

{('a','b'), ('a','c'), ...}

O, como parece que está haciendo un gráfico, un diccionario donde los valores son listas de vértices en lugar de vértices individuales, p.

{'a':['b','c'],...}

Para hacer el conjunto de tuplas, reemplace la línea

        graph[key] = val

Con

graph.append((key, val))

Para hacer un diccionario a listas, use

if key in graph:
    graph[key].append(val)
else:
    graph[key] = [val]

¡Espero que esto ayude!

0
Simon Crane 4 oct. 2019 a las 23:35
58244141