Файл в словарь печатает только один - PullRequest
0 голосов
/ 05 октября 2019

У меня есть текстовый файл, который гласит:

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  

, но когда я печатаю его после превращения в словарь

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())))

Он печатает:

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

как мне сделать, чтобы там печатались повторяющиеся клавиши?

Ответы [ 4 ]

0 голосов
/ 05 октября 2019

Поскольку вы, похоже, работаете со структурой графов, я бы порекомендовал вам взглянуть на пакет NetworkX для Python. У них есть готовые графовые структуры данных, которые вы можете использовать, и множество алгоритмов, которые могут работать с ними.

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)

Если вы все еще хотите использовать только ванильный Python:

Словари Pythonможет иметь только одно значение на ключ. Чтобы сохранить несколько значений для одного ключа, необходимо сохранить ключи в списке значений.

my_dict = {
    'a': ['b', 'c', 'd'],
    'b': ['h'],
    ...
}
0 голосов
/ 05 октября 2019

Словари в Python (и на любом другом языке, который я знаю) имеют уникальные значения для каждого ключа и будут перезаписывать их, когда вы добавляете новое значение для существующего ключа.

Рассмотрим другой тип структуры данныхкак набор кортежей, например,

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

Или, как выглядит, как будто вы создаете граф, словарь, значения которого представляют собой списки вершин вместо отдельных вершин, например,

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

Чтобы создать набор кортежей, замените строку

        graph[key] = val

на

graph.append((key, val))

Чтобы создать словарь для списков, используйте

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

Надеюсь, это поможет!

0 голосов
/ 05 октября 2019

Вы не можете, потому что это словарь, и ему нельзя иметь два одинаковых ключа, иначе это будет неоднозначно. Вы можете группировать по ключу.

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())))

Так что теперь у вас есть для каждого ключа массив со своими значениями.

0 голосов
/ 05 октября 2019

Я предполагаю, что для этого вы захотите использовать список строк вместо одной строки в качестве значения, иначе ваш словарь будет продолжать заменять значение для того же ключа.

Вместо:

{'a': 'b'}

Возможно, вы захотите такую ​​структуру, как:

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

Использование вашей функции:

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']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...