Python将一个列表中的元素分成两组,使得每组数据之和尽可能的相等
# 分离数组
def split_array(arr):
# 获取数组并排序
a = list(arr)
#a.sort()
# 另一个数组
b = list()
# 以上a,b作为待返回的数组
# 计算数组大小
n = len(a)#1000
#求和
smr = sum(a)
# 和的一半,简称半和
hs = smr / 2
# 临时和
s = 0
# 从最大的数字开始遍历数组
for i in range(-1,0-n,-1):
# 预判该数字加和结果
ns = s + a[i]
if ns > hs:
# 如果超出半和则跳过
continue
else:
# 如果未超过半和,则:
# 1, 取该元素加和
s += a[i]
# 2, 从 a 中将元素转移到 b
b.append(a[i])
a.pop(i)
# 如果最终和与半和之差,不够最小元素,则完成
if abs(s - hs) <= a[-1]:
break
return a, b
if __name__ == '__main__':
# 测试:
# [1,2,3,4,5] -> [1,2,5] & [3,4]
# arr = test_input()
print(split_array([118, 299, 472, 485, 468, 392, 515, 800, 982]))
打印结果:
([118, 299, 472, 485, 468, 392, 800], [982, 515])