吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1476|回复: 9
收起左侧

[求助] PYTHON 筛选列表数字求和

[复制链接]
kick068 发表于 2020-4-7 14:38
本帖最后由 kick068 于 2020-4-7 17:02 编辑

[Asm] 纯文本查看 复制代码
l = []  #例:l = [20,25,30,40,45,70,80]

def combination(l, n):
    l = list(sorted(filter(lambda x: x <= n, l)))
    combination_impl(l, n, [])

def combination_impl(l, n, stack):
    if n == 0:
        print(stack)
        return
    for i in range(0, len(l)):
        if l[i] <= n:
            stack.append(l[i])
            combination_impl(l[i + 1:], n - l[i], stack)
            stack.pop()
        else:
            break

combination(l, 100)  #l 筛选出l里面的数字的和是100的几种方法


例子得出来的结果:
[Asm] 纯文本查看 复制代码
D:\app\venv\Scripts\python.exe D:/app/scratch.py
[20, 80]
[25, 30, 45]
[30, 70]

Process finished with exit code 0



PS:假如我知道结果为100  当l = [33,70,88,50 ] 里面输入的数据不能得到100.怎么写 让其筛选出来最接近的几个数据,并且筛选后和最终结果的差值。
顺便怎么把结果和 l 里面 修改为input键入。~~ 求大神改改~

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

素问何问 发表于 2020-4-7 15:07
我无法理解你的题目 你的表达有问题
hshcompass 发表于 2020-4-7 15:20
 楼主| kick068 发表于 2020-4-7 16:59
素问何问 发表于 2020-4-7 15:07
我无法理解你的题目 你的表达有问题

这样改过能理解了不- -我阐述有问题- -
 楼主| kick068 发表于 2020-4-7 17:05

这样阐明了。尽力了- -
ymhld 发表于 2020-4-7 17:42
本帖最后由 ymhld 于 2020-4-7 17:44 编辑

for i in rang(1,10):
    print('误差%d‘%i)
    combination(l, 100+i)
print('误差%d‘%-i)
  
    combination(l, 100-i)
ymhld 发表于 2020-4-7 17:54
这样吧
[Python] 纯文本查看 复制代码
l = [20,25,30,40,45,70,80]  #例:l = [20,25,30,40,45,70,80]

def input_l():
	l=[]
	flag=True
	while flag:
		l1=input ("输入原始数据 Q退出  ")
		if l1.lower()=="q":
			flag=False
		else:
			l1=int(l1)
			l.append(l1)
	return l



 
def combination(l, n):
    l = list(sorted(filter(lambda x: x <= n, l)))
    combination_impl(l, n, [])
 
def combination_impl(l, n, stack):
    if n == 0:
        print(stack)
        return
    for i in range(0, len(l)):
        if l[i] <= n:
            stack.append(l[i])
            combination_impl(l[i + 1:], n - l[i], stack)
            stack.pop()
        else:
            break

l=input_l()
for i in range(11):
	print('误差%d'%i) 
	combination(l, 100+i)  #l 筛选出l里面的数字的和是100的几种方法
	print('误差%d'%-i) 
	combination(l, 100-i)  #l
 楼主| kick068 发表于 2020-4-7 18:04
感觉咋不对呢- -~
 楼主| kick068 发表于 2020-4-7 18:21
ymhld 发表于 2020-4-7 17:54
这样吧
[mw_shl_code=python,true]l = [20,25,30,40,45,70,80]  #例:l = [20,25,30,40,45,70,80]

我的意思是这样的,列不成立的时候。。。当列表中没有相加等于100的时候,取最接近100的相加的值,比如50+30+19 <100 :差-1   or 50+30+22>100: 差2 这样表明出来!
ymhld 发表于 2020-4-7 19:44
[Python] 纯文本查看 复制代码

import itertools
from functools import reduce

def combim(l,n):
    n2=n
    stack=[]
    for numlen in range(1,len(l)):
        for i in itertools.combinations(l,numlen):
            n1=reduce(lambda x, y: x+y,i)
            if abs(n-n1)<n2:
                n2=abs(n-n1)
                stack=[]
                stack.append(i)
            else:
                if abs(n-n1)==n2:
                    stack.append(i)
    return stack

 


def input_l():
    l=[]
    flag=True
    while flag:
        l1=input ("输入原始数据 Q退出  ")
        if l1.lower()=="q":
            flag=False
        else:
            l1=int(l1)
            l.append(l1)
    return l
l = [20,25,30,40,45,70,80]  #例:l = [20,25,30,40,45,70,80]
#l=input_l()
n=105
stack=combim(l,n)
print('结果为:  ',stack)
print('相差',abs(reduce(lambda x, y: x+y,list(stack[0]))-n))

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
kick068 + 1 + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 06:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表