繁体   English   中英

计算列表中元素从0到n-1的总和,然后与最大的元素进行比较

[英]Calculate a sum of elements of the list from 0 to n-1 and compare with the largest one

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

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])

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

您正在犯几个错误:

  • 您正在将值与索引混淆。 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'

如果值相等(除非第一个元素是最大元素,否则将返回"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

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

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'

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

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匹配的max_arg

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM