我正在尝试实例化两个变量,一个用于最小值,一个用于最小索引,然后遍历列表的索引并计算的值

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 - endsumstartsum - (total - startsum) = 2*startsum - total,在生成器表达式中变为2*u - total

10-08 04:08