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?
4 respuestas
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']}
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'],
...
}
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.
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!
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.