繁体   English   中英

Python-迭代自交叉引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM