我有一个用Python阅读的列表:
with open('african_countries.txt') as f:
content = f.readlines()
文件african_countries.txt采用以下格式:
Algeria Algeria
Algeria Libya
Algeria Mali
Algeria Mauritania
Algeria Morocco
Algeria Niger
--------------------------
Angola Angola
Angola DR Congo
Angola Namibia
Angola Zambia
--------------------------
文件中的第一列按字母顺序列出了非洲的每个国家/地区。第二列按字母顺序列出第一行中与国家/地区直接边界的国家/地区。我将文件保存到列表中,我可以遍历每一行。我有一些可以识别直接边界的正则表达式,但是我试图弄清楚当给定两个国家(没有直接边界)时如何循环,并看到需要跨越多少边界才能连接它们?
非常感谢任何帮助。
答案 0 :(得分:1)
这是一个图论问题,你可以在here中找到它的解决方案。
你需要做的第一件事是建立这样的东西:
graph = {'A': ['B', 'C'],
'B': ['C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F'],
'F': ['C']}
,但是用国家而不是字母(例如'阿尔及利亚':[利比亚,马里,...])。要实现这一点,你必须读取整个文件,并为每个国家获取一个键及其值(基本上是你所显示的每个块内的信息)。
从这一点开始,您可以使用我上面给出的链接上的功能:
def find_shortest_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
if not graph.has_key(start):
return None
shortest = None
for node in graph[start]:
if node not in path:
newpath = find_shortest_path(graph, node, end, path)
if newpath:
if not shortest or len(newpath) < len(shortest):
shortest = newpath
return shortest
,可以按以下方式使用:
>>> find_shortest_path(graph, 'A', 'D')
['A', 'C', 'D']
>>>
编辑:将文件转换为图表字典的快速解决方案。
fid = open('out.txt','r')
lines = fid.readlines()
key = ''
group = []
graph = {}
for l in lines:
if l[0]=='-':
graph[key]=group
key = ''
group = []
else:
sp = l.split()
key = sp[0]
group.append(sp[1])
print(graph)
结果:
{'Angola': ['Angola', 'DR', 'Namibia', 'Zambia'], 'Algeria': ['Algeria', 'Libya', 'Mali', 'Mauritania', 'Morocco', 'Niger']}