0

数値のすべての約数を出力するコードの書き方を理解しようとしています。私が最も興味を持っているアプローチは、キーが素約数で、値が割り切れる回数である辞書を返す関数から始まります。私はすでにこの関数を次のように書いています:

def div_pair(num):
    divPair = {}
    for prime in prime_gen():
        primeDegree = 0
        while num % prime == 0:
            num = int(num / prime)
            primeDegree += 1
        if primeDegree > 0:
            divPair[prime] = primeDegree
        if num == 1:
            return divPair

例として、数値 84,000 は辞書を出力します

{2: 5, 3: 1, 5: 3, 7: 1}

ここからやりたいことは、divPair が返すさまざまな数値によって返される任意の値の累乗 (?) を生成し、これらの累乗に一致する素数を掛けることです。これは、パワーセットを生成するために使用しようとしている種類のコードを使用する例です。

from itertools import product
list(product(range(5+1), range(1+1), range(3+1), range(1+1)))

これを出力します:

[(0, 0, 0, 0),
 (0, 0, 0, 1),
 (0, 0, 1, 0),
 (0, 0, 1, 1),
 (0, 0, 2, 0),
 (0, 0, 2, 1),
 (0, 0, 3, 0),
 (0, 0, 3, 1),
 (0, 1, 0, 0),
 (0, 1, 0, 1),
 (0, 1, 1, 0),
 (0, 1, 1, 1),
 (0, 1, 2, 0),
 (0, 1, 2, 1),
 (0, 1, 3, 0),
 (0, 1, 3, 1),
 (1, 0, 0, 0),
 (1, 0, 0, 1),
 (1, 0, 1, 0),
 (1, 0, 1, 1),
 (1, 0, 2, 0),
 (1, 0, 2, 1),
 (1, 0, 3, 0),
 (1, 0, 3, 1),
 (1, 1, 0, 0),
 (1, 1, 0, 1),
 (1, 1, 1, 0),
 (1, 1, 1, 1),
 (1, 1, 2, 0),
 (1, 1, 2, 1),
 (1, 1, 3, 0),
 (1, 1, 3, 1),
 (2, 0, 0, 0),
 (2, 0, 0, 1),
 (2, 0, 1, 0),
 (2, 0, 1, 1),
 (2, 0, 2, 0),
 (2, 0, 2, 1),
 (2, 0, 3, 0),
 (2, 0, 3, 1),
 (2, 1, 0, 0),
 (2, 1, 0, 1),
 (2, 1, 1, 0),
 (2, 1, 1, 1),
 (2, 1, 2, 0),
 (2, 1, 2, 1),
 (2, 1, 3, 0),
 (2, 1, 3, 1),
 (3, 0, 0, 0),
 (3, 0, 0, 1),
 (3, 0, 1, 0),
 (3, 0, 1, 1),
 (3, 0, 2, 0),
 (3, 0, 2, 1),
 (3, 0, 3, 0),
 (3, 0, 3, 1),
 (3, 1, 0, 0),
 (3, 1, 0, 1),
 (3, 1, 1, 0),
 (3, 1, 1, 1),
 (3, 1, 2, 0),
 (3, 1, 2, 1),
 (3, 1, 3, 0),
 (3, 1, 3, 1),
 (4, 0, 0, 0),
 (4, 0, 0, 1),
 (4, 0, 1, 0),
 (4, 0, 1, 1),
 (4, 0, 2, 0),
 (4, 0, 2, 1),
 (4, 0, 3, 0),
 (4, 0, 3, 1),
 (4, 1, 0, 0),
 (4, 1, 0, 1),
 (4, 1, 1, 0),
 (4, 1, 1, 1),
 (4, 1, 2, 0),
 (4, 1, 2, 1),
 (4, 1, 3, 0),
 (4, 1, 3, 1),
 (5, 0, 0, 0),
 (5, 0, 0, 1),
 (5, 0, 1, 0),
 (5, 0, 1, 1),
 (5, 0, 2, 0),
 (5, 0, 2, 1),
 (5, 0, 3, 0),
 (5, 0, 3, 1),
 (5, 1, 0, 0),
 (5, 1, 0, 1),
 (5, 1, 1, 0),
 (5, 1, 1, 1),
 (5, 1, 2, 0),
 (5, 1, 2, 1),
 (5, 1, 3, 0),
 (5, 1, 3, 1)]

これは本当に私が望む出力です。何らかの方法で divPair.values() を受け入れるようにコードを変更するだけです。だから私はこれを書きます:

from itertools import product
divPair = div_pair(84000)
list(product(range(i+1) for i in divPair.values()))

それは正しいはずのように思えますが、この混乱を出力します:

[(range(0, 6),), (range(0, 2),), (range(0, 4),), (range(0, 2),)]

そして、私はそれを修正する方法を理解できません。私がやろうとしていることに対する素晴らしい解決策を提供する投稿がここにあります。私は自分が知っていることで彼らに向かって努力しようとしているだけです。

4

1 に答える 1

2

product(range(i+1) for i in divPair.values())引数の積を返します。これには、ジェネレーターという 1 つの引数が渡されます 。ジェネレーターはrangeオブジェクトのリストを生成しました。これは次のようなものです。

>>> list(product(['range', 'range', 'range']))
[('range',), ('range',), ('range',)]

 

範囲を個別の引数として渡す必要があります。

これを行う:

list(product(*[range(i+1) for i in divPair.values()]))

(またはこれ)

list(product(*(range(i+1) for i in divPair.values())))
于 2013-03-11T20:14:10.383 に答える