【问题标题】:Finding List Intersection using Python List Slices & recursion使用 Python 列表切片和递归查找列表交集
【发布时间】:2020-09-22 22:59:12
【问题描述】:
def findIntersection(list1, list2):
    if list1 == [] or list2 == []:
        return []
    elif list1[0] < list2[0]:
        return [list1[0]] + findIntersection(list[1:], list2)
    elif list1[0] > list2[0]:
        return [list2[0]] + findIntersection(list1, list2[1:])
    else:
        return ([list1[0]] + findIntersection(list1[1:], list2[1:])) 

这是我到目前为止写的代码,最终目标是找到两个列表的交集。例如, findIntersection([1,2,4], [0,2,3]) == [2] 或 findIntersection([0,2,3,5], [1,2,4,5,6 ]) == [2,5]。

我应该从哪里开始,我做错了什么。也将不胜感激对 python 切片的更多解释。谢谢。

【问题讨论】:

    标签: python recursion slice


    【解决方案1】:

    你的问题是你小心返回了不在交集的元素:

    elif list1[0] < list2[0]:
        return [list1[0]] + findIntersection(list[1:], list2)
    elif list1[0] > list2[0]:
        return [list2[0]] + findIntersection(list1, list2[1:])
    else:
        return ([list1[0]] + findIntersection(list1[1:], list2[1:]))
    

    在这三种情况中,只有一种标识有效的交集元素,是最后一种:该元素在两个列表中。

    对于其他两个,您的递归是正确的,但添加较低的元素是错误的。你必须丢弃这个元素,因为你知道它不在两个列表中。

    elif list1[0] < list2[0]:
        # Drop the lowest element of list1 and recur
        return findIntersection(list[1:], list2)
    elif list1[0] > list2[0]:
        # Drop the lowest element of list2 and recur
        return findIntersection(list1, list2[1:])
    else:
        The element is in both lists; add it to the solution and recur.
        return ([list1[0]] + findIntersection(list1[1:], list2[1:]))
    

    【讨论】:

      【解决方案2】:

      [i for i in list1 if i in list2]

      使用列表推导。当且仅当在 list2 中找到它们时,循环遍历 list1 中的每个元素并将它们添加到新列表中。

      如果你想使用切片和递归,那么你就非常接近了......你只想在交集列表中包含一个元素,如果它在两个列表中 - 这仅在最终的else 中是正确的。此外,您的代码中有错字 - list 应该是 list1。另请注意,此方法需要对输入列表进行排序(升序或降序)。

      def findIntersection(list1, list2):
          if list1 == [] or list2 == []:
              return []
          elif list1[0] < list2[0]:
              return findIntersection(list1[1:], list2)
          elif list1[0] > list2[0]:
              return findIntersection(list1, list2[1:])
          else:
              return [list1[0]] + findIntersection(list1[1:], list2[1:])
      
      list1 = [0,2,3,5]
      list2 = [1,2,3,4,5,6]
      print(findIntersection(list1, list2))
      

      返回[2,3,5]

      【讨论】:

      • 这是一个有效的答案,但是我正在尝试使用 Python 切片/递归,以便进一步理解这个概念。
      • 啊。抱歉错过了。如果我理解您尝试这样做的概念,那么您的列表需要先按升序排序吗?
      • 正确。因此,在我使用的几个测试用例中,我正在查看已经按升序设置的列表。
      • 感谢您的回答。我不敢相信我的代码中没有看到如此明显的错误。您如何以最简单的形式解释 Python 切片的概念?我发现它是将列表拆分为 first 和 rest,但它提供了什么好处?
      猜你喜欢
      • 2020-12-14
      • 2020-04-06
      • 2010-12-14
      • 2014-11-02
      • 2020-02-14
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多