【问题标题】:Python - Iterative self cross referencingPython - 迭代自交叉引用
【发布时间】:2014-12-30 23:16:48
【问题描述】:

我有一点逻辑上的挑战。我在 excel 中有一个表,其中包含一个标识符列和一个交叉引用列。单个标识符可以有多行,表示多个交叉引用。 (参见下面的基本示例)

任何以字母“X”结尾的记录都表明它是一个交叉引用,而不是一个实际的标识符。我需要为每个标识符生成一个交叉引用列表,但将其追溯到实际的交叉引用标识符。因此,以上表中的“A1”为例,我需要返回的列表如下“A2,A3,B1,B3”。请注意,列表中没有以“X”结尾的标识符,它们已通过表追溯到实际的源记录。

任何想法或帮助将不胜感激。我正在使用 python 和 xlrd 来读取表格。

【问题讨论】:

    标签: python excel many-to-many relationship xlrd


    【解决方案1】:
    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")
    

    【讨论】:

    • 哇...真快!奇迹般有效。谢谢!
    • 感谢您的解决方案。它在一张小桌子上效果很好。但是,当我在一个大表(6000 条记录)上运行它时,我达到了递归限制。对大型数组的替代方法有什么想法吗?
    • 你有可能有循环引用吗? (即 bx 回到斧头?)
    • 我没有考虑过,但既然你指出了,是的,这是完全有可能的,因为数据不是最干净的数据。有没有简单的方法来检查?
    • 我不确定我想我发布了一个解决循环引用问题的解决方案
    猜你喜欢
    • 2015-01-21
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2015-10-26
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多