简化Python迭代

Jua*_* C. 3 python product factorization

每当我尝试解决一些数学问题,比如找到一定数量因素的特定产品,我就用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)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,它非常简单并快速完成工作,但我想知道你们是否知道更简单或更简单的方法来编写它.关于如何做到这一点的任何想法,而不是使用那么多迭代或反复重复几乎相同的代码.这显然是有3个因素,但我添加的因素越多,代码越长,重复性越高.关于如何简化这类简单问题的代码的任何想法?谢谢

Kev*_*vin 5

Itertool的笛卡尔积用于模拟多个嵌套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)
Run Code Online (Sandbox Code Playgroud)

结果:

factors : 1,4,9
factors : 1,6,6
factors : 1,9,4
(...etc)
Run Code Online (Sandbox Code Playgroud)

如果x,y和z中的每个范围始终相同,则只需指定一次:

for x, y, z in itertools.product(range(1,10), repeat=3):
Run Code Online (Sandbox Code Playgroud)

如果您厌倦了为该product =行键入数字星号,您可以使用reduce将任意数量的参数相乘:

for factors in itertools.product(range(1,3), repeat=10):
    product = reduce(lambda x, y: x*y, factors)
Run Code Online (Sandbox Code Playgroud)

一旦您的格式字符串变得难以处理,您可以依赖于join串联因子:

if product == 512:
    #use `map` to turn the factors into strings, first
    print "factors: " + ",".join(map(str, factors))
Run Code Online (Sandbox Code Playgroud)