我正在尝试实例化两个变量,一个用于最小值,一个用于最小索引,然后遍历列表的索引并计算的值
difference = sum(beginning) - sum(end)
每个索引。
如果
difference
小于最小存储值,则将最小值设置为difference
,将最小索引设置为index
,最后返回使用最小索引找到的切片。例如:
a=[8,-1,6]
找到的切片:
[8,-1]
和[6]
我的代码做了我想要的3个值的列表,但是我不知道如何使它适用于更长的列表,例如
a = [-11,15,14,12,12]
应该返回
[-11,15,14], [12,12]
我的代码:
def row(a):
b = a[0] - sum(a[1:])
c = sum(a[:-1]) - a[-1]
if b <= c:
return a[:1], a[1:]
else:
return a[:-1], a[-1:]
编辑:
我实际上需要最小化
sum(beginning) - sum(end)
的绝对值。 最佳答案
这是将您的代码扩展为可容纳任何大小的列表的地方。它创建一个包含切片索引以及开始和结束之间的绝对差的元组列表,然后使用内置的min
函数查找哪个绝对差是最小的。
该代码将在Python 2或Python 3上运行。
from __future__ import print_function
def row(seq):
result = []
for i in range(1, len(seq)):
start = seq[:i]
end = seq[i:]
startsum = sum(start)
endsum = sum(end)
diff = abs(startsum - endsum)
print(start, end, startsum, endsum, diff)
result.append((diff, i))
t = min(result)
print('min', t)
i = t[1]
return seq[:i], seq[i:]
a = [-11, 15, 14, 12, 12]
print(a)
print(row(a))
输出
[-11, 15, 14, 12, 12]
[-11] [15, 14, 12, 12] -11 53 64
[-11, 15] [14, 12, 12] 4 38 34
[-11, 15, 14] [12, 12] 18 24 6
[-11, 15, 14, 12] [12] 30 12 18
min (6, 3)
([-11, 15, 14], [12, 12])
print
调用只是为了表明该函数正在执行我们期望的操作。我们可以使函数更紧凑,如下所示:def row(seq):
result = []
for i in range(1, len(seq)):
diff = abs(sum(seq[:i]) - sum(seq[i:]))
result.append((diff, i))
i = min(result)[1]
return seq[:i], seq[i:]
我们可以使用列表推导来通过在循环中计算累加和,然后使用生成器表达式计算最小绝对差来使函数更有效:
def row(seq):
allsums = []
total = 0
for u in seq:
total += u
allsums.append(total)
i = min((abs(2*u - total), i) for i, u in enumerate(allsums[:-1], 1))[1]
return seq[:i], seq[i:]
allsums
列表中的值与第一个版本中的startsum
值相对应,相应的endsum
值就是total - startsum
。因此,差异startsum - endsum
为startsum - (total - startsum)
= 2*startsum - total
,在生成器表达式中变为2*u - total
。