【问题标题】:Python: Creating combinations from a list of lists in a tree-like data structurePython:从树状数据结构中的列表创建组合
【发布时间】:2015-04-21 02:23:45
【问题描述】:

我有一个n 对数的列表,每对中的数字在 1 到 70 之间。

aList = [[1, 5], [1, 12],...,[5, 45], [5, 47],...,[45, 49], [45, 65], ...]

此列表中的每一对都充当树的根,并从中构建组合。

在这个例子中 [1, 5] 是根:

#                    [45, 65]
#             [5,45]/           [y, k]--...
#            /      \[45,49]   /
#           |                 |
# root: [1,5]--[5, x] -- [x, y]--[y,z]--...
#           |                 |
#            \      /[47,?]    \
#             [5,47]            [y, j]--...
#                   \[47,?]

我只在n[1] == n+1[0] 时尝试从配对中创建组合。

例如:

[1,5,45,49,...]
[1,5,45,65,...]
[1,5,47,x,y,k,...]
[1,5,47,x,y,z,...]
[1,5,47,x,y,j,...]
[1,5,47,?,...]
[1,5,47,?,??]

我尝试使用itertools.product,但它会产生所有可能的组合。

提前致谢。

【问题讨论】:

    标签: python list tree combinations


    【解决方案1】:

    似乎我略过了“在此示例中 [1, 5] 是根:”位,因此使我之前的答案过于复杂了一点。一个标准的有向图和为寻路而修改的Breadth-first search 就可以完成这项工作。

    def directed_graph_from_edges(edges):
        graph = {}
        for a,b in edges:
            graph.setdefault(a,set())
            graph[a].add(b)
        return graph
    

    然后,路径查找算法只需将一条边作为输入,而不是单个顶点。但是,它仍然使用路径中的最后一个顶点 (last_vertex = path[-1]) 作为下一个要展开的节点。再一次,我将把寻路算法留作练习。

    【讨论】:

      【解决方案2】:

      谢谢Nuclearman,您的回答帮助我想出了一个解决方案。

      它很脏,我相信有更好的 Pythonic 方式来编写它,但对我来说已经足够了。

      def treeSearch(i):
           if i in graph.keys():
               return graph[i]
           else:
               return [0]
      
      edges = aList
      graph = {}
      for a,b in edges:
          if a not in graph.keys():
              graph[a] = []
              for c,d in edges:
                 if a == c:
                     graph[a].append(d)
      
      for key in graph:
          for k in graph[key]:
              for j in treeSearch(k):
                  for h in treeSearch(j):
                      for g in treeSearch(h):
                          for f in treeSearch(g):
                              for v in treeSearch(f):
                                  print [key,k,j,h,g,f,v]
      

      【讨论】:

      • 您的方法还不错,但深度有限。例如,它不会找到说 [key,k,j,h,g,f,v,a] 或更多的更深层次的路径。如果您只寻找长度为 7 或更小的路径,这可能不是问题。但是,您的算法将找不到任何长度为 8 或更长的路径。
      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2017-06-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多