【问题标题】:Overlapping lists function returns False when True in python重叠列表函数在 python 中为 True 时返回 False
【发布时间】:2015-08-15 21:13:25
【问题描述】:

我是一名编程新手,正在学习 Torbjoern Lager 的 46 个简单 Python 练习。这是数字 10:定义一个函数重叠(),它接受两个列表,如果它们至少有一个共同成员,则返回 True,否则返回 False。您可以使用 is_member() 函数或 in 运算符,但为了练习,您应该(也)使用两个嵌套的 for 循环来编写它。

def over(list1,list2):
    for i in list1:
        for j in list2:
            return i==j

我认为我有一个不错的简单解决方案,但它无法识别列表重叠,除非重叠元素是第一个元素。

over(["a","b","c","d"],["e","f","a","h"]) 

返回假

over(["a","b","c","d"],["a","f","g","h"])

返回真

由于某种原因,它没有搜索所有组合。任何帮助将不胜感激。

【问题讨论】:

  • 提示:return 停止你的函数。
  • 作者忘记了 if 语句,需要在 List 之间进行比较。这个练习的一个变体....它返回一个列表,其中只包含两个列表之间共有的元素。 def overlay(): a = raw_input("请给出数字或单词的列表:").split() b = raw_input("请给出数字或单词的列表:").split() the_common = list(set (a).intersection(b)) # 交集方法在一个新的 List 中返回共同的元素。打印 the_common 重叠()

标签: python list overlap


【解决方案1】:

它没有搜索所有组合,因为您在嵌套循环的第一次迭代中返回。你可以这样做:

def over(list1,list2):
    for i in list1:
        for j in list2:
            if i == j:
                return True

    return False

一旦发现任何重叠,就会返回True。如果没有发现重叠,它将到达最后一行并返回False

【讨论】:

    【解决方案2】:

    问题是您在第一次迭代时返回i==j。您的函数将只比较 list1[0] 和 list2[0]。解决方法是添加if。 这是一个例子:

    def over(list1,list2):
        for i in list1:
            for j in list2:
                if i == j:
                    return True
        return False
    

    【讨论】:

    • 老实说,我第一次尝试了这个!我仍然有同样的问题。也许我搞砸了语法什么的?
    • 好的,查看旧代码。我的回报 False 是在错误的地方。如果它与 if 处于同一级别,为什么这不起作用?
    • @K.Solovieva,因为在第一个循环的第一次迭代之后,您将返回 False。程序将开始你的第一个循环,进行所有迭代,然后看到return False,我认为这不是你想要的
    • 亲爱的妈妈,我明白了!谢谢。
    【解决方案3】:

    当您在第一次迭代后返回时,您应该按照其他答案中的建议使用 if 进行测试,但使用 any 会是更好的方法:

    def over(list1,list2):
        return any(i ==j for i in list1 for j in list2)
    

    相当于:

    def over(list1,list2):
        for i in list1:
            for j in list2:
                if i == j:
                    return True
        return False
    

    短路匹配,如果有匹配则返回 True,如果没有匹配则返回 False。

    或者为更大的输入使用集合是最快的方法:

    def over(list1, list2):
        return not set(list1).isdisjoint(list2)
    

    如果 not set(list1).isdisjoint(list2) 为 True,我们至少有一个共同元素。

    【讨论】:

      【解决方案4】:

      当您执行“return”语句时,de 执行会停止,就像在 Java 中发生的那样。它返回 true,因为您在两个数组的第一个位置都有 'a'。

      你可以试试这个:

      result = False;
      for i in list1:
               for j in list2:
                  if i == j:
                      result=True;
      return result
      

      如果你想让它更高效:

      for i in list1:
           for j in list2:
              if i == j:
                  return True;
      return False;
      

      【讨论】:

      • 那么我需要用什么来代替 end 才能让它工作?我尝试了 if/else,但我认为这会带来同样的问题。谢谢!
      • @K.Solovieva,看看我的回答。
      • 好的,查看旧代码。我的回报 False 是在错误的地方。如果它与 if 处于同一级别,为什么这不起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多