python - 我如何从我的函数中进行通用编码?

标签 python

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

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在生成器表达式中。

关于python - 我如何从我的函数中进行通用编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953414/

相关文章:

python - 一个类的多个实例

python - 类型错误 : unsupported operand type(s) for &: 'NoneType' and 'BitVector'

python - Twisted 有什么了不起的?

Python 错误 : execute cannot be used while an asynchronous query is underway

python - 将数据从一对列拆分为多对列

python - 使用 Python 3.6 在运行时获取类的通用类型

python - 属性错误 : module 'numpy' has no attribute '__version__'

python - 如何找到列表中的最小正数

python - 使用 mysqldump 执行 mySQL 备份时权限被拒绝

python - 就地自定义对象使用 __getitem__ python 3.5 与 python 3.6 解包不同的行为