【问题标题】:Calculate a sum of elements of the list from 0 to n-1 and compare with the largest one计算列表从 0 到 n-1 的元素之和,并与最大的一个进行比较
【发布时间】:2015-08-05 07:26:40
【问题描述】:

我正在尝试编写一个代码来检查给定列表的某些元素组合的总和是否等于该列表中的最大元素。我写了这样一段代码:

def function(argument): 

  max_arg = max(argument)
  argument.remove(max_arg)
  for i in argument:

      if sum(argument[0:i+1]) == max_arg:
          return "true"
      else:
          return "false"

print function([1, 2, 3, 6])

我得到“假”字符串(这是一个明显的错误)。有人可以指出,上述代码有什么问题吗?

【问题讨论】:

    标签: python function python-2.7 sum compare


    【解决方案1】:

    你犯了几个错误:

    • 您将值与索引混淆了。 for 循环为您提供列表中的值,而不是列表中的索引。仅因为您的值是整数,您的循环不会立即中断。

      换句话说,i 没有设置为012,而是设置为123

    • 立即从函数中返回'false',当您找到一个不等于最大值的组合时。第一个总和是3(值1 然后转换为sum(argument[0:2]) 产生3),但你不要让循环继续。

    要修复这些错误,请对 range() 函数的结果使用循环,并且仅在尝试所有组合时返回 'false'

    def function(argument): 
        max_arg = max(argument)
        argument.remove(max_arg)
    
        for i in range(len(argument)):
            if sum(argument[:i + 1]) == max_arg:
                return "true"
        return "false"
    

    您的“不同组合”仍然很原始。您可以尝试使用itertools.combinations() 和不断增加的长度生成 3 个数字的所有可能组合:

    from itertools import combinations
    
    def function(argument): 
        max_arg = max(argument)
        argument.remove(max_arg)
    
        for length in range(1, len(argument) + 1):
            for combo in combinations(argument, length):
                if sum(combo) == max_arg:
                    return "true"
        return "false"
    

    现在元素的排列顺序不再重要; [1, 4, 3, 2, 6] 将返回 true,因为 1 + 3 + 2 产生 6。

    演示:

    >>> function([1, 2, 3, 6])
    'true'
    >>> function([1, 4, 3, 2, 6])
    'true'
    >>> function([1, 4, 3, 6])
    'false'
    

    【讨论】:

    • 谢谢,这个解决方案很完美!
    【解决方案2】:

    这仅对元素执行一次求和:

    def function(argument):  
      max_arg = max(argument)
      argument.remove(max_arg)
      s = 0
      for i in argument:
          s += i
          if s == max_arg:
              return "true"
      return "false"
    

    例子:

    >>> function([1, 2, 3, 6])
    'true'
    >>> function([1, 2, 3, 7])
    'false'
    >>> function([1, 2, 3, 4, 6])
    'true'
    

    【讨论】:

    • function([1, 2, 3, 6, 1])怎么样
    • @TheBrofessor 返回True,我认为应该是这样,因为[1,2,3] 加起来的最大元素为6。你有不同的解释吗?
    • 对不起,一个工作。我的意思是这样的[30, 10, 10, 12, 10],其中 s = 10...20...32...42 并返回 false
    • @TheBrofessor 据我了解 OP 的要求,他想对 "from 0 to n-1" 求和(在删除最大值之后)。如果这是他想要的,那么为[30, 10, 10, 12, 10] 返回False 是正确的。
    【解决方案3】:

    如果值相等,则始终在第一个循环本身中返回(除非第一个元素是最大元素,否则不会返回"true"),否则返回"false",而不是不返回立即"False",只有在没有找到任何案例时才返回"false"

    并且您将值用作索引,而不是您想枚举 argument 并将索引用作索引

    例子-

    def function(argument): 
        max_arg = max(argument)
        argument.remove(max_arg)
        for i in range(len(argument)):
            if sum(argument[0:i+1]) == max_arg:
                return "true"
        return "false"
    
    print function([1, 2, 3, 6])
    

    示例/演示 -

    >>> def function(argument):
    ...     max_arg = max(argument)
    ...     argument.remove(max_arg)
    ...     for i in range(len(argument)):
    ...         if sum(argument[0:i+1]) == max_arg:
    ...             return "true"
    ...     return "false"
    ...
    >>> print(function([1, 2, 3, 6]))
    true
    >>> print(function([1, 2, 3, 7]))
    false
    

    【讨论】:

      【解决方案4】:

      请记住,加法是关联和交换的......

      from itertools import permutations
      
      def function(argument): 
          max_arg = max(argument)
          argument.remove(max_arg)
      
          for combo in permutations(argument):
              s = 0
              for element in combo:
                  s = s + element
                  if s == max_arg:
                      return "true"
          return "false"
      

      我们看到我们不需要找到所有可能的组合。我们可以找到所有大小 (n-1) 的排列并将元素相加,直到找到与 max_arg 匹配的元素。

      【讨论】:

      • 这可能适用于给定的输入,但不适用于[1, 2, 3, 4, 6]; OP 正在尝试不同的组合
      猜你喜欢
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多