【问题标题】:How to sum two elements from a single list and compare to an integer parameter如何对单个列表中的两个元素求和并与整数参数进行比较
【发布时间】:2019-10-08 01:51:20
【问题描述】:

我正在编写一个函数来检查同一列表中任何两个元素的总和是否等于一个整数参数。

例如:给定 17 和 [10, 15, 3, 7],它应该返回 True,因为 17 是 10 + 7。

给定 17 和 [10, 15, 4, 8],它应该返回 False,因为列表中不存在总和为 17 的对。

我完全不知道如何处理这个问题。任何帮助表示赞赏!

for i in range(0, len(lst) - 1):
    return k == lst[i] + lst[i]

return lst

给定 17 和 [10, 15, 3, 7],它应该返回 True,因为 17 是 10 + 7。

给定 17 和 [10, 15, 4, 8],它应该返回 False,因为列表中不存在总和为 17 的对。

【问题讨论】:

    标签: python list sum integer


    【解决方案1】:
    def check(n, lst):
        lst_set = set(lst)
        for i in lst:
            if (n-i) in lst_set: 
                if (n-i) != i:   # check to see if it returned itself (not a pair)
                    return True
        return False
    

    这里您将n 作为目标编号,然后将lst 作为您的输入。

    您首先将输入转换为集合以加快查找速度,然后为每个目标数字减去当前数字,然后查看它是否在集合中。如果是,那么您有一个答案True,如果不是,请继续。如果你到达终点却没有找到一个,那么你不要并返回False

    这背后的主要思想是,当你用你的目标号码减去你现在的号码时,你就会得到你需要的号码来做一对。因此,您检查您的集合以查看该数字是否存在于其中。您无需以这种方式遍历每个潜在配对。


    编辑: 如果您想处理重复输入,那么您可以随时构建集合,这将比上述无法处理重复输入的答案慢,但与非哈希表实现相比仍然非常快。

    def check_withdup(n, lst):
        lst_set = set()   # start with blank set
        for i in lst:
            if (n-i) in lst_set:   # if it is in there, it wasn't itself so it is a pair
                return True
            else:
                lst_set.add(i)   # if it isn't in there, add it in
        return False
    

    这将在一次迭代中工作,但set.add() 的时间比从同一列表创建集合的时间慢,这就是为什么上面会比这更快。

    【讨论】:

    • 您应该从匹配集合中排除当前值,否则给定目标编号20[10, 15, 3, 7] 列表,即使没有数字对,您的函数也会返回True在列表中将产生20 的总和。
    • 感谢您的回答!追问:为什么lst有零个或只有一个元素时函数返回None?
    • 谢谢@blhsing 我解决了这个问题。很好的收获。
    • 在这两种情况下它都会返回False 而不是None 这是因为不可能有一对。 for i in lst 将有 1 个或 0 个元素,并且迭代永远不会返回 True,然后默认返回 False
    • 例如,如果您的列表中有 10 个两次,这将不起作用,请尝试以下操作:l = [10,6,7,5,10] print(check(20,l))这将为您返回 False 但它应该返回 True
    【解决方案2】:
    def checkSum(num, lst):
        for i in lst:
           for j in lst:
             if num==i + j:
                return True
    
    return False
    

    这种方法不如前面的答案那么有效,但它更像是一种蛮力方法,比较所有对的总和并检查它们是否满足条件。

    【讨论】:

      【解决方案3】:
      def check(n, lst):
      
          for i in lst:
              temp = lst.copy()
              temp.remove(i)
              if n-i in temp:
                  return True
          return False
      
      
      l = [10,6,7,5,10]
      
      print(check(20,l))
      

      返回

      True
      

      【讨论】:

        【解决方案4】:

        试试这个兄弟

         def check(n,lst):
                for item in lst:
                    temp = item
                    for i in range(len(lst)):
                        if lst.index(temp) != i: #This is to avoid comparison with the same index
                            if n == temp + lst[i]:
                                print("MATCH FOUND! ", temp, " and ", lst[i])
                                return True
                            else:
                                continue
        

        【讨论】:

          猜你喜欢
          • 2017-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-06
          相关资源
          最近更新 更多