Python.获取接近某个值的列表

描述一下:
有一个长长的数组,里面的数最大为某个值,比如30;我想从里面提取数组,尽可能接近这个值,把所有可能的,不重复的结果以列表嵌套的方式返回来;
基本思路:

  1. 将列表字符元素转换为整数并排序;
  2. 获取一个列表中的一组数,让他们相加的结果接近于给定数;
  3. 去除找到的元素,把提取的一数组组成的新列表;
  4. 判断最后一个值,结束程序;
'''
用于获取接近某个值的列表
'''


def ls_to_int(ls):
	'''
	将列表字符元素转换为整数并排序
	:param ls:需要转换的列表
	:return:转换后的列表
	'''
	ls = list(map(int, ls))
	ls = list(sorted(ls, reverse=True))
	return ls


def remove_ls(ls, ls_add):
	'''
	去除找到的元素
	:param ls: 原表
	:param ls_add: 原表中提取的一部分数值组成的新列表
	:return: 去除ls_add后的ls
	'''
	for i in range(len(ls_add)):
	remove_value = ls.index(ls_add[i])
	ls.pop(remove_value)
	return ls


def get_ls_equal_num(ls, num):
	'''
	获取一个列表中的一组数,让他们相加的结果接近于给定数
	:param ls: 列表
	:param num: 接近值
	:return: 排序在前的,并接近给定值的一组数列表
	'''
	ls_add = []
	x = 0
	for i in range(len(ls)):
	# print('-' * 30 + str(i))
	x = sum(ls_add)
	# print('x的当前值{}'.format(x))
	if x > num:
	ls_add.remove(ls[i - 1])
	# print('弹出的值{}'.format(ls[i - 1]))
	ls_add.append(ls[i])
	# print('加入当前的ls[i]值{}'.format(ls[i]))
	# 判断最后一个值
	if sum(ls_add) > num:
	ls_add.pop()
	return ls_add


ls = ['1', '30', '30', '30', '30', '1', '27', '23', '1', '17', '15', '11', '9', '7', '6', '2', '2', '2', '1', '1']

print(ls)


def get_all_close2num(ls):
	'''
	获取所有接近30的列表
	:param ls: 需要查找的列表
	:return: 所有接近值列表的列表
	'''
	ls = ls_to_int(ls)
	ls_ = []
	while len(ls) > 0:
	ls_add = get_ls_equal_num(ls, 30)
	# print(ls_add)
	ls_.append(ls_add)
	ls = remove_ls(ls, ls_add)
	return ls_


ls = get_all_close2num(ls)
print(ls)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的遗传算法是一种模拟自然选择和遗传机制的优化算法,用于解决复杂问题,如寻找函数的最小或最优解。遗传算法主要包含以下几个步骤: 1. 初始化种群:随机生成一组解(称为个体或染色体),这些解代表可能的函数值。 2. 适应度评估:计算每个个体对应的目标函数值,适应度越高,表示该个体越接近解。 3. 选择:基于适应度,选择一部分个体进入下代,概率较高的个体被选中的可能性越大。 4. 变异:对选择的个体进行变异操作,可能包括基因突变(改变某个基因)或交叉(交换部分基因)。 5. 进化:重复步骤3和4,逐步迭代种群,直到满足停止条件(如达到预设的迭代次数或适应度达到预设阈)。 6. 返回最优解:最终的种群中,适应度最高的个体通常就是所求的函数最小近似解。 在Python中,你可以使用一些库如`deap`(Distributed Evolutionary Algorithms in Python)来实现遗传算法。以下是一个简单的例子: ```python from deap import base, creator, tools # 创建适应度函数和种群 creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) def evalOneMax(individual): return -sum(individual), # 函数最小对应最大适应度 toolbox = base.Toolbox() toolbox.register("attr_bool", random.randint, 0, 1) # 二进制编码 toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=10) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("evaluate", evalOneMax) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutFlipBit, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) # 运行遗传算法 pop = toolbox.population(n=50) best_gen = tools.selBest(pop, k=1) for gen in range(100): # 迭代次数 offspring = toolbox.select(pop, len(pop)) offspring = [toolbox.clone(ind) for ind in offspring] for child1, child2 in zip(offspring[::2], offspring[1::2]): if random.random() < 0.5: toolbox.mate(child1, child2) del child1.fitness.values del child2.fitness.values for mutant in offspring: if random.random() < 0.2: toolbox.mutate(mutant) del mutant.fitness.values invalid_ind = [ind for ind in offspring if not ind.fitness.valid] fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) for ind, fit in zip(invalid_ind, fitnesses): ind.fitness.values = fit pop[:] = offspring best = tools.selBest(pop, k=1) # 获取当前最佳解 print("Best individual: ", best, " with fitness: ", best.fitness.values) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值