我有一个csv文件,其格式如下:
header1,header2,header3,header4
1,4,2,5
1,4,0,5
0,4,2,5
我的问题的相关信息仅在第1列和第3列。我正在尝试查找此csv文件中的所有可能路径,其中两个值连接(在有向路径中),如果它们在同一行。例如,在上面的数据中:
1 is connected to 2
1 is connected to 0
0 is connected to 2
然后所有可能的路径是:
[1,2]
[1,0,2]
[0,2]
借助在线资源(特别是this),我已经能够找到指定起始节点和结束节点的所有路径。以下是我的代码:
import csv
def main():
inputFile = "file_directory"
a =[]
with open(inputFile) as csvfile:
reader = csv.reader(csvfile)
next(reader)
for line in reader:
a.append([line[0], line[2]])
# This will print all the paths starting with 1 and ending with 2
print(str(getAllSimplePaths('1', '2', a)))
def getAllSimplePaths(originNode, targetNode, a):
return helpGetAllSimplePaths(targetNode,
[originNode],
set(originNode),
a,
list())
def helpGetAllSimplePaths(targetNode, currentPath, usedNodes, a, answerPaths):
lastNode = currentPath[-1]
if lastNode == targetNode:
answerPaths.append(list(currentPath))
else:
for elem in a:
if elem[0] == lastNode:
if elem[1] not in usedNodes:
currentPath.append(elem[1])
usedNodes.add(elem[1])
helpGetAllSimplePaths(targetNode,currentPath,usedNodes,a,answerPaths)
usedNodes.remove(elem[1])
currentPath.pop()
return answerPaths
if __name__ == '__main__':
main()
当我运行时,我正确得到以下结果:
[['1', '2'], ['1', '0', '2']]
但是,我真正想做的是能够遍历我的csv文件的第二列中的所有元素,并找到每个元素的所有可能路径。我已经做了好几天了,我无法想办法做到这一点。我的csv文件大约有2000行。任何帮助/建议将不胜感激!谢谢!
更新:额外信息
csv文件中的每一行都是两个元素之间的路径。所以我拥有的路径数量将等于我在csv文件中的行数。现在,从我的问题示例中的第一行开始,1连接到2,因此['1','2']是路径。对于每一行,我想通过查看同一行第三列(elem2)找到第一列中元素(elem1)的连接,然后在第一列中搜索csv文件中elem2的所有行。如果它存在于某行的第一列中,则elem2必须连接到同一行第三列(elem3)中的相应元素。在这种情况下,我们的路径是[elem1,elem2,elem3]。类似地,对于elem3,我将不得不查看所有行以查看它是否存在于第一列中。如果它不存在那么我就完成了第一条路径。接下来我转到第二条道路。
上述示例的所需输出如下所示:
[['1','2'], ['1', '0', '2'], ['0', '2'], ['1','0']]
我正在使用Python 3.5.1。
答案 0 :(得分:1)
<强>被修改强>
这是我更优化的版本。在一个非常大的csv文件上使用它之前,我建议你删除一些/大部分打印 - 这不会影响最终结果。
import csv
from pprint import pprint, pformat
def main():
inputFile = "paths.csv"
with open(inputFile, newline='') as csvfile:
reader = csv.reader(csvfile)
next(reader)
a = [[row[0], row[2]] for row in reader]
print('a:\n', pformat(a))
# construct an adjacency *dictionary*
nodeToNodes = {}
for src, dst in a:
nodeToNodes.setdefault(src, []).append(dst)
print('\nnodeToNodes:\n', pformat(nodeToNodes))
print('\ngathering results:')
all_paths = []
for src, dst in a:
print(' {} <-> {}'.format(src, dst))
more_paths = getAllSimplePaths(dst, [src], {src}, nodeToNodes, [])
print(' {}'.format(pformat(more_paths)))
all_paths.extend(more_paths)
print('\nall paths: {}'.format(pformat(all_paths)))
def getAllSimplePaths(targetNode, currentPath, usedNodes, nodeToNodes, answerPaths):
lastNode = currentPath[-1]
if lastNode == targetNode:
answerPaths.append(currentPath[:])
elif lastNode in nodeToNodes:
for neighbor in nodeToNodes[lastNode]:
if neighbor not in usedNodes:
currentPath.append(neighbor)
usedNodes.add(neighbor)
getAllSimplePaths(targetNode, currentPath, usedNodes, nodeToNodes,
answerPaths)
usedNodes.remove(neighbor)
currentPath.pop()
return answerPaths
if __name__ == '__main__':
main()
输出:
a:
[['1', '2'], ['1', '0'], ['0', '2']]
nodeToNodes:
{'0': ['2'], '1': ['2', '0']}
gathering results:
1 <-> 2
[['1', '2'], ['1', '0', '2']]
1 <-> 0
[['1', '0']]
0 <-> 2
[['0', '2']]
all paths: [['1', '2'], ['1', '0', '2'], ['1', '0'], ['0', '2']]