我正在尝试实例化两个变量,一个用于最小值,一个用于最小索引,然后迭代列表的索引并计算
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
在生成器表达式中。
关于python - 我如何从我的函数中进行通用编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953414/