素因数分解を約数にする。ループ,組み合わせの方法を教えて下さい。


問題点① 素因数分解の個数が3個の場合しか対応していません。  
問題点② リスト内包表記の使い方がわかりませんでした。関数部分1行で書けますか。  
問題点③ ( . [ . { 。使い方、変換についての、おすすめのページを教えて下さい。  
よろしくお願いします。

[code]

    from sympy import *
    import itertools
    var('My_Yakusu')
    def My_SoinsuToYakuSu(My_factorint):
        k_list = list(My_factorint.keys())
        v_list = list(My_factorint.values())
        My_list=list(itertools.product(
                     list(range(v_list[0]+1)),
                     list(range(v_list[1]+1)),
                     list(range(v_list[2]+1))))
        My_Yakusu = []
        for i in range(len(My_list)):
            My_Yakusu.append(  k_list[0] ** My_list[i][0] \
                             * k_list[1] ** My_list[i][1] \
                             * k_list[2] ** My_list[i][2] )
        return sorted(My_Yakusu)
    
    print("#sy 90-約数     ",divisors(90, generator=False))
    print("#sy 90-素因数分解",factorint(90))
    print("#my 90-約数     ",My_SoinsuToYakuSu(factorint(90)))
    print("")
    print("#630は、間違っています。")
    print("#sy630-約数     ",divisors(630, generator=False))
    print("#sy630-素因数分解",factorint(630))
    print("#my630-約数     ",My_SoinsuToYakuSu(factorint(630)))
    
    #sy 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    #sy 90-素因数分解 {2: 1, 3: 2, 5: 1}
    #my 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
    #630は、間違っています。
    #sy630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    #sy630-素因数分解 {2: 1, 3: 2, 5: 1, 7: 1}
    #my630-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
[/code]




> 問題点① 素因数分解の個数が3個の場合しか対応していません。  
>  問題点② リスト内包表記の使い方がわかりませんでした。関数部分1行で書けますか。

※ Python 3.8 以上が必要

[code]

    from itertools import product
    from math import prod
    from sympy import factorint, divisors
    import sys
    
    def My_SoinsuToYakuSu(factordict):
      return sorted([
        prod([k**v[i] for i, k in enumerate(factordict.keys())])
        for v in product(*map(lambda v: range(v+1), factordict.values()))
      ])
    
    if __name__ == '__main__':
      print("#sy 90-約数     ", divisors(90, generator=False))
      print("#sy 90-素因数分解", factorint(90))
      print("#my 90-約数     ", My_SoinsuToYakuSu(factorint(90)))
      print("")
      print("#sy630-約数     ", divisors(630, generator=False))
      print("#sy630-素因数分解", factorint(630))
      print("#my630-約数     ", My_SoinsuToYakuSu(factorint(630)))
    
      ## for testing
      print(divisors(sys.maxsize, generator=False) == My_SoinsuToYakuSu(factorint(sys.maxsize)))
    
    =>
    #sy 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    #sy 90-素因数分解 {2: 1, 3: 2, 5: 1}
    #my 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
    #sy630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    #sy630-素因数分解 {2: 1, 3: 2, 5: 1, 7: 1}
    #my630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    True
    
[/code]




> 問題点① 素因数分解の個数が3個の場合しか対応していません。  
>  問題点② リスト内包表記の使い方がわかりませんでした。関数部分1行で書けますか。

※ Python 3.8 以上が必要

[code]

    from itertools import product
    from math import prod
    from sympy import factorint, divisors
    import sys
    
    def My_SoinsuToYakuSu(factordict):
      return sorted([
        prod([k**v[i] for i, k in enumerate(factordict.keys())])
        for v in product(*map(lambda v: range(v+1), factordict.values()))
      ])
    
    if __name__ == '__main__':
      print("#sy 90-約数     ", divisors(90, generator=False))
      print("#sy 90-素因数分解", factorint(90))
      print("#my 90-約数     ", My_SoinsuToYakuSu(factorint(90)))
      print("")
      print("#sy630-約数     ", divisors(630, generator=False))
      print("#sy630-素因数分解", factorint(630))
      print("#my630-約数     ", My_SoinsuToYakuSu(factorint(630)))
    
      ## for testing
      print(divisors(sys.maxsize, generator=False) == My_SoinsuToYakuSu(factorint(sys.maxsize)))
    
    =>
    #sy 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    #sy 90-素因数分解 {2: 1, 3: 2, 5: 1}
    #my 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
    #sy630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    #sy630-素因数分解 {2: 1, 3: 2, 5: 1, 7: 1}
    #my630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    True
    
[/code]

