3

特定の数の因数の特定の製品を見つけるなど、数学の問題を解決しようとするたびに、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 つの要因によるものですが、追加する要因が増えるほど、コードはより長く、より反復的になります。この単純なタイプの問題のコードを単純化する方法についてのアイデアはありますか? ありがとう

4

2 に答える 2

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)

結果:

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))
于 2013-06-10T18:16:02.043 に答える
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)

より多くの要因については、再帰関数を使用します。

于 2013-06-10T18:27:09.630 に答える