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编程:如何将一个包含若干整数的List写入dat文件中