【问题标题】:Python: finding a pathway through lists using recursionPython:使用递归通过列表查找路径
【发布时间】:2020-02-14 13:12:58
【问题描述】:

使用 python,我试图弄清楚如何找到从列表中的一个数字到另一个列表中的数字的“路线”。

例如,如果我有列表:

A = [1,2,3,4]
B = [4,5,6,7]
C = [7,8,9,10]

从 1 到 10 的路线将是 A -> B -> C,因为 4 在 A 和 B 中,而 7 在 B 和 C 中。我试图弄清楚如何找到并记录从对于具有更多元素的列表数量更多且并非每个列表都共享理想的公共元素的问题,将一个值转换为另一个值。我想我需要使用递归,但似乎无法提出解决方案。任何帮助都将不胜感激。

【问题讨论】:

  • 这个问题似乎和在图中寻找最短路径一样。不过,您的问题仍然不精确: A 是否应该连接到 B,因为 1 AND 2 AND 3 AND 4 在 A 中,然后 4 在 A 和 B 中?还是如果 A = [1, 4] 仍然有效?
  • 如果 A = [1, 4] 仍然可以工作

标签: python list loops recursion math


【解决方案1】:

如果你负担得起,我建议以下方法

  • 创建一个图表,其中每个节点代表其中一个列表
  • 对于每个列表中的每个数字,如果该数字存在于另一个列表中,则在节点之间创建一个连接
  • 对于查询,(1) 找到起始节点,(2) 找到结束节点,(3) 使用最短路径算法,例如从networkX

【讨论】:

    【解决方案2】:

    您可以将递归与生成器一起使用:

    d = {'A': [1, 2, 3, 4], 'B': [4, 5, 6, 7], 'C': [7, 8, 9, 10]}
    def find_path(start, end, c = [], seen = []):
       _r = [a for a, b in d.items() if any(i in b for i in d[start]) and a not in seen]
       if end in _r:
          yield c+[end]
       else:
          for i in _r:
            yield from find_path(i, end, c = c+[i], seen=seen+[start])
    
    
    print(min(find_path('A', 'C', c = ['A']), key=len))
    

    输出:

    ['A', 'B', 'C']
    

    这将适用于更大的输入:

    d = {'A': [1, 2, 3, 4], 'B': [4, 5, 6, 7], 'C': [7, 8, 9, 10], 'D':[30, 45, 23], 'F':[10, 11, 12, 13], 'G':[13, 14, 15]}
    print(min(find_path('A', 'G', c = ['A'], seen=['A']), key=len))
    

    输出:

    ['A', 'B', 'C', 'F', 'G']
    

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多