Python 用一串数字产生加、减或不加的变化,得到100
我有一个数字串,string=123456789,我想打印所有变化,在数字之间插入加法、减法或什么都不做,以得到100。大多数数字的顺序保持不变 示例:1+2+3-4+5+6+78+9=100 我甚至不知道如何开始。我曾想过列出所有可能的+-x代表零的组合,然后插入每个组合并进行测试,但这似乎需要很长时间。 有什么建议吗?您可以使用和从itertools模块中获得建议。我们建立所有可能的组合,然后只过滤那些计算值为100的组合Python 用一串数字产生加、减或不加的变化,得到100,python,python-3.x,sequence,variations,Python,Python 3.x,Sequence,Variations,我有一个数字串,string=123456789,我想打印所有变化,在数字之间插入加法、减法或什么都不做,以得到100。大多数数字的顺序保持不变 示例:1+2+3-4+5+6+78+9=100 我甚至不知道如何开始。我曾想过列出所有可能的+-x代表零的组合,然后插入每个组合并进行测试,但这似乎需要很长时间。 有什么建议吗?您可以使用和从itertools模块中获得建议。我们建立所有可能的组合,然后只过滤那些计算值为100的组合 from itertools import product, zip
from itertools import product, zip_longest
operations = ['-', '+', '']
s = '123456789'
combinations = (zip_longest(s, ops, fillvalue='') for ops in product(operations, repeat=8))
to_eval = (''.join(i + j for i, j in combination) for combination in combinations)
print([i for i in to_eval if eval(i) == 100])
>>> ['1+2+3-4+5+6+78+9', '1+2+34-5+67-8+9', '1+23-4+5+6+78-9', '1+23-4+56+7+8+9', '12-3-4+5-6+7+89', '12+3-4+5+67+8+9', '12+3+4+5-6-7+89', '123-4-5-6-7+8-9', '123-45-67+89', '123+4-5+67-89', '123+45-67+8-9']
eval本身并不是坏的,只是如果任何用户输入都能进入到你正在评估的东西中,它会导致严重的安全问题,而这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串,或者找到一种不同的方法
注意:关于优化,请看这里:您可以使用itertools模块和从中执行优化。我们建立所有可能的组合,然后只过滤那些计算值为100的组合
from itertools import product, zip_longest
operations = ['-', '+', '']
s = '123456789'
combinations = (zip_longest(s, ops, fillvalue='') for ops in product(operations, repeat=8))
to_eval = (''.join(i + j for i, j in combination) for combination in combinations)
print([i for i in to_eval if eval(i) == 100])
>>> ['1+2+3-4+5+6+78+9', '1+2+34-5+67-8+9', '1+23-4+5+6+78-9', '1+23-4+56+7+8+9', '12-3-4+5-6+7+89', '12+3-4+5+67+8+9', '12+3+4+5-6-7+89', '123-4-5-6-7+8-9', '123-45-67+89', '123+4-5+67-89', '123+45-67+8-9']
eval本身并不是坏的,只是如果任何用户输入都能进入到你正在评估的东西中,它会导致严重的安全问题,而这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串,或者找到一种不同的方法
注意:有关优化,请查看以下内容:
导致
1+23-4+56+7+8+9 = 100
12+3-4+5+67+8+9 = 100
1+2+34-5+67-8+9 = 100
1+2+3-4+5+6+78+9 = 100
123-4-5-6-7+8-9 = 100
123+45-67+8-9 = 100
1+23-4+5+6+78-9 = 100
12-3-4+5-6+7+89 = 100
12+3+4+5-6-7+89 = 100
123-45-67+89 = 100
123+4-5+67-89 = 100
导致
1+23-4+56+7+8+9 = 100
12+3-4+5+67+8+9 = 100
1+2+34-5+67-8+9 = 100
1+2+3-4+5+6+78+9 = 100
123-4-5-6-7+8-9 = 100
123+45-67+8-9 = 100
1+23-4+5+6+78-9 = 100
12-3-4+5-6+7+89 = 100
12+3+4+5-6-7+89 = 100
123-45-67+89 = 100
123+4-5+67-89 = 100
3^8仅为6561,因此列举所有可能性看起来非常可行,我该如何着手?我需要8个值,但只有3件东西要放进去。我发现的代码只支持较少的值,例如itertools.combinations3^8的起始长度仅为6561,因此枚举所有可能性看起来非常可行,我该如何做呢?我需要8个值,但只有3件东西要放进去。我发现的代码只支持较少的起始长度值,例如itertools.combinationsTry不使用eval…eval本身并不坏,只是如果任何用户输入都可以进入您正在评估的内容,那么它可能会导致严重的安全问题,这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串或找到不同的方法。尽量不要使用eval…eval本身并不坏,只是如果任何用户输入都可以进入您正在评估的内容,那么eval可能会导致严重的安全问题,这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串,或者找到一种不同的方法。