Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用一串数字产生加、减或不加的变化,得到100_Python_Python 3.x_Sequence_Variations - Fatal编程技术网

Python 用一串数字产生加、减或不加的变化,得到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

我有一个数字串,string=123456789,我想打印所有变化,在数字之间插入加法、减法或什么都不做,以得到100。大多数数字的顺序保持不变

示例:1+2+3-4+5+6+78+9=100

我甚至不知道如何开始。我曾想过列出所有可能的+-x代表零的组合,然后插入每个组合并进行测试,但这似乎需要很长时间。 有什么建议吗?

您可以使用和从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本身并不是坏的,只是如果任何用户输入都能进入到你正在评估的东西中,它会导致严重的安全问题,而这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串,或者找到一种不同的方法

注意:关于优化,请看这里:

您可以使用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可能会导致严重的安全问题,这里的情况并非如此。为个人项目这样做是可以的。在生产环境中,您可能希望自己解析字符串,或者找到一种不同的方法。