我有一对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
,但它产生了所有可能的组合。
提前致谢。
答案 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]