python编程,把一个整数list分成两个list,要求两个(list里整数总和)之差值最小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python编程,把一个整数list分成两个list,要求两个(list里整数总和)之差值最小相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env python
#-*- encoding: utf-8 -*-
from itertools import compress, imap
def fun(lst):
min_number = 100000000
length = len(lst)
total = 2**length
record = None
f = lambda x:compress(lst, imap(int,bin(x)[2:].rjust(length,\'0\')))
for n in xrange(total):
plus = f(n)
minus = f(total-n-1)
tmp = abs(sum(plus) - sum(minus))
if tmp < min_number:
record = n
min_number = tmp
plus = list(f(record))
minus = list(f(total-record-1))
return (plus, minus, min_number)
def main():
print \'(分组1, 分组2, 差值)\'
print fun([1,2,3,1,4,10,7,5,23])
main()


拿了个list来穷举试了一下,Python 2.7.3测试通过。

参考技术A

用了greedy algorithm,即每一步选最优解(假设无负数):

def slist(aList):
aList.sort()
aList.reverse()
a=[]
b=[]
for i in aList:
if sum(a)>sum(b):
b.append(i)
else:
a.append(i)
return a,b,sum(a)-sum(b)
print slist([1,2,3,1,4,10,7,5,23])

参考技术B #参考其中一个评论的代码,在他基础上修改优化了下,执行方式 python XXX.py list
#!/usr/bin/env pythons
#-*- encoding: utf-8 -*-
from itertools import compress, imap
import sys
def division(lst):
    min_number = sum(lst)
    length = len(lst)
    total = 2**length
    record = None
    f = lambda x:compress(lst,imap(int,bin(x)[2:].rjust(length,'0')))
    #a=bin(7)[2:]>>'111'    a.rjust(8,'0')>>右对齐 '00000111'
    #imap(int,str)  把str转成列表,且列表元素为整型
    for n in xrange(total):
        plus = f(n)
        minus = f(total-n-1)
        tmp = abs(sum(plus) - sum(minus))
        if tmp < min_number:
            record = n
            min_number = tmp
    plus = list(f(record))
    minus = list(f(total-record-1))
    return (plus, minus, min_number)
def main():
    arg=list(sys.argv[1].strip('[]').split(','))
    arglist=list(imap(int,arg))
    print '(list1, list2, diffrence)'
    print division(arglist)
if __name__=='__main__':
    main()

Python 集合

集合使用操作

 

 

集合主要功能是可以将两个列表中重复的值打印或删除。

集合中没有下标,都是随机排列的。

 

创建两个集合,并获取两个集合内的相同数(交集)。

1 list_1 = [1,2,3,1,2]
2 list_1 = set(list_1)
3 list_2 = set([3,4,5,6])
4 print(list_1,list_2)
5 print(list_1.intersection(list_2))

输出

技术分享

 

集合知识点

 

 

知识点1 (集合交互)

集合变量1.intersection(集合变量2):求出两组集合的交集

集合变量1.union(集合变量2):秀出两组集合并集。

集合变量1.difference(集合变量2):求出只有变量1有的差集。

集合变量1.symmetric_difference(集合变量2):求出两个集合中的对称差集。

集合云运算符

运算符:集合变量1 & 集合变量2:求出交集

运算符:集合变量1 | 集合变量2:求出并集

运算符:集合变量1 - 集合变量2:求出差集

运算符:集合变量1 ^ 集合变量2:求出对称差集 

判断

集合变量1.isdisjoint(集合变量2):判断两个集合是否有交集。

集合变量1.issubset(集合变量2):判断集合1是否是集合2的子集。

集合变量1.ssuoperset(集合变量2):判断集合1是否试剂盒2的父集。

 

 

 

知识点2

集合变量.add(添加值):添加集合中单个值。

集合变量.update([值1,值2]):添加集合中多个值。

集合变量.remove(值):删除集合中的值。

集合变量.pop():删除任意一个值,并返回删除值。

集合变量.discard():删除集合中的值,不存在的话不报错。,不反回值。

len(集合变量):查看变量的长度

 

 

知识点3 

判断

in:判断x是不是s的成员

not in:判断x是否不是s的成员

 

以上是关于python编程,把一个整数list分成两个list,要求两个(list里整数总和)之差值最小的主要内容,如果未能解决你的问题,请参考以下文章

python 推导式中多个if else 问题

python编程:如何将一个包含若干整数的List写入dat文件中

python编程:如何将一个包含若干整数的List写入dat文件中

Python函数式编程(把函数作为参数传入)

python从键盘输入两个整数,求这两个整数的和

python两个长度相等的list元素合并?