文件到字典只打印一个

File to dictionary only prints one

我有一个文本文件,上面写着:

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'}

如何让它打印重复的键?

为此我假设您希望使用字符串列表而不是单个字符串作为值,否则您的字典将继续替换相同键的值。

而不是:

{'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']}

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]

希望对您有所帮助!

你不能,因为那是一本字典,不允许有两个相同的键,否则会产生歧义。您可以按键分组。

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

现在每个键都有一个数组及其值。

由于您似乎在使用图形结构,我建议您查看 Python 的 NetworkX 包。它们具有供您使用的预构建图形数据结构和许多可以对其进行操作的算法。

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'],
    ...
}