Python:从树状数据结构中的列表列表创建组合

时间:2014-05-18 19:25:28

标签: python list tree combinations

我有一对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,但它产生了所有可能的组合。

提前致谢。

2 个答案:

答案 0 :(得分: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])作为要展开的下一个节点。再一次,我将把路径寻找算法作为练习。

答案 1 :(得分:0)

感谢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]