每次我尝试解决一些数学问题,例如找到一定数量的因素的特定产品,我在Python中这样做
for x in xrange(1,10):
for y in xrange(1,10):
for z in xrange(1,10):
product = x * y * z
if product == 36:
print "factors : {0},{1},{2}".format(x,y,z)
这很简单,在这个例子中快速完成工作,但我想知道你们是否知道一种更简单或更简单的方式来编写它。关于如何做到这一点的任何想法,而不是使用那么多迭代或反复重复几乎相同的代码。这显然是有3个因素,但我添加的因素越多,代码越长,重复性越高。关于如何简化这类简单问题的代码的任何想法? 感谢
答案 0 :(得分:5)
Itertool的cartesian product模拟多个嵌套for循环的效果。
import itertools
for x, y, z in itertools.product(range(1,10), range(1,10), range(1,10)):
product = x * y * z
if product == 36:
print "factors : {0},{1},{2}".format(x,y,z)
结果:
factors : 1,4,9
factors : 1,6,6
factors : 1,9,4
(...etc)
如果x,y和z中的每个范围始终相同,则只需指定一次:
for x, y, z in itertools.product(range(1,10), repeat=3):
如果您厌倦为product =
行键入数字星号,可以使用reduce
将任意数量的参数相乘:
for factors in itertools.product(range(1,3), repeat=10):
product = reduce(lambda x, y: x*y, factors)
一旦你的格式字符串变得难以处理,你可以依靠join
将因子串起来:
if product == 512:
#use `map` to turn the factors into strings, first
print "factors: " + ",".join(map(str, factors))
答案 1 :(得分:4)
y
从x
开始,避免重复。计算z
而不是运行另一个循环。
for x in xrange(1,10):
for y in xrange(x,10):
z, r = divmod(36, x*y)
if r == 0:
print "factors : {0},{1},{2}".format(x,y,z)
对于更多因素,我会使用递归函数。