具有任何元素的列表的最大可能乘积

max possible product of a list with any elements

我已经制作了以下功能。但它没有通过特定的测试用例,我不知道输入是什么。此功能无法 return 最大产品的可能输入列表是什么? 输入将是数字列表,输出应该是最大可能的乘积,从列表中取出任何数字,以便乘积最大。

def max_prod(xs):
  negl = []
  nego = []
  pos = []
  prod = 1
  # if any positive integer greater than 1, then dont need to consider negative integers between -1 and 0
  if any(i for i in xs if i >= 1):
    for i in xs :
      if i <= -1 : nego.append(i)
      elif i > 1 : pos.append(i)
    if  len(nego) % 2 == 1 :
      nego.remove(max(nego))
    for  i in pos : prod = prod * i
    for j in nego : prod = prod * j
    return str(prod)
  
  #if there is no positive integer greater than or equal to 1, 
  else :
    l = []
    for i in xs :
      if i > 0 : pos.append(i)
    if len(pos) != 0 : l.append(max(pos))
    for i in xs :
      if i <= -1  :
        nego.append(i)
      elif i < 0  and i > -1 :
        negl.append(i)
    # if there is only one negative integer lesser than -1
    if len(nego) == 1 :
      if len(negl) == 0:
        return str(0)
      else :
        l.append((nego[0] * min(negl)))
        return str(max(l))
    # if multiple integers lesser than -1
    else :
      if len(nego) >= 1 and len(nego) % 2 == 1 :
        nego.remove(max(nego))
      for  i in nego : prod = prod * i
      return str(prod)

Post 请求发布的代码不起作用的极端情况。

代码为单个负数提供了错误答案。

示例:

print(max_prod([0]))
# Output: 1

答案应该是0

简单的解决方法是添加条件:

if xs == [0]:
    return 0

更简单的代码

from math import prod

def max_prod(xs):
  pos = [i for i in xs if i > 0]
  neg = [i for i in xs if i < 0]

  if len(neg) % 2:
    neg.remove(max(neg))  
    
  if len(pos) > 0 or len(neg) > 0:
    return str(prod(pos) * prod(neg))

  return "0"

测试

for xs in [[], [0], [2], [-2], [2, 3], [0, 2, 3], 
           [-2, -3], [-2, -3, -4], [2, 0, -2, -3], 
           [2, 0, -2, -3, -1]]:
  print(f'{xs} max-> {max_prod(xs)}')

输出

[] max-> 0
[0] max-> 0
[2] max-> 2
[-2] max-> 0
[2, 3] max-> 6
[0, 2, 3] max-> 6
[-2, -3] max-> 6
[-2, -3, -4] max-> 12
[2, 0, -2, -3] max-> 12
[2, 0, -2, -3, -1] max-> 12