我有一个数字列表(例如:)[-1, 1, -4, 5]
,我必须从列表中删除数字而不更改列表的总和。我想删除可能具有最大绝对值的数字,而不改变总数,在示例中删除[-1, -4, 5]
将离开[1]
,因此总和不会改变。
我写了一种简单的方法,即找出所有不改变总数的可能组合,看看哪个组合消除了最大的绝对值。但这真的很慢,因为实际列表会比这大得多。
这是我的组合代码:
from itertools import chain, combinations
def remove(items):
all_comb = chain.from_iterable(combinations(items, n+1)
for n in xrange(len(items)))
biggest = None
biggest_sum = 0
for comb in all_comb:
if sum(comb) != 0:
continue # this comb would change total, skip
abs_sum = sum(abs(item) for item in comb)
if abs_sum > biggest_sum:
biggest = comb
biggest_sum = abs_sum
return biggest
print remove([-1, 1, -4, 5])
它可以正确打印(-1, -4, 5)
。但是,我正在寻找一些比遍历所有可能的项目组合更聪明、更有效的解决方案。
有任何想法吗?