[英]Python - Iterative self cross referencing
我有一个逻辑上的挑战。 我在excel中有一个表,其中包含一个标识符列和一个交叉引用列。 单个标识符可以有多行,表示多个交叉引用。 (请参见下面的基本示例)
任何以字母“ X”结尾的记录都表明它是一个交叉引用,而不是实际的标识符。 我需要为每个标识符生成一个交叉引用列表,但要追溯到实际的交叉引用标识符。 因此,以“ A1”作为上表的示例,我需要返回的列表如下“ A2,A3,B1,B3”。 注意,列表中没有以“ X”结尾的标识符,它们已通过表追溯到实际的源记录。
任何想法或帮助将不胜感激。 我正在使用python和xlrd读取表。
t = [
["a1","a2"],
["a1","a3"],
["a1","ax"],
["ax","b1"],
["ax","bx"],
["bx","b3"]
]
import itertools
def find_matches(t,key):
return list(itertools.chain(*[[v] if not v.endswith("x") else find_matches(t,v) for k,v in t if k == key]))
print find_matches(t,"a1")
您可以将列表视为图的邻接矩阵
就像是
t = [
["a1","a2"],
["a1","a3"],
["a1","ax"],
["ax","b1"],
["ax","bx"],
["bx","b3"]
]
class MyGraph:
def __init__(self,adjacency_table):
self.table = adjacency_table
self.graph = {}
for from_node,to_node in adjacency_table:
if from_node in self.graph:
self.graph[from_node].append(to_node)
else:
self.graph[from_node] = [to_node]
print self.graph
def find_leaves(self,v):
seen = set(v)
def search(v):
for vertex in self.graph[v]:
if vertex in seen:
continue
seen.add(vertex)
if vertex in self.graph:
for p in search(vertex):
yield p
else:
yield vertex
for p in search(v):
yield p
print list(MyGraph(t).find_leaves("a1"))#,"a1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.