0

편집 : 원래 게시물에서 목록 이해를 사용하고 싶다고 말했지만 기꺼이 해결책을 수락합니다. 나는 단순히 목록 이해가 그것을하는 가장 간단한 방법이라고 가정했다.임의의 수의 변수를 가진 Python 제품


나는 프라임 분해와 관련된 문제에 대해 연구 중이며 목록 이해와 관련하여 문제가 발생했습니다.

숫자의 소수 요소 목록이 있는데 목록에는 숫자가 포함될 수 있습니다. [2,3,5] 또는 [2] 또는 [2,3,11,17] 등이 될 수 있습니다.

권력의 모든 제품을 찾을 수 있기를 바랍니다. 이 숫자는 제품이 100,000보다 작거나 같은 값입니다. 예를 들어, 만약 내가 소수 분해가 [2,3,5]라면, 자연수 a, b, c에 대해 (2^a) (3^b) (5^c) (2^a) (3^b) (5^c) < = 100,000을 만족한다.

소수 요소의 수가 임의 길이라는 점을 감안할 때 목록 이해로이를 수행 할 수있는 방법이 있습니까?

+1

아마도 하나의 목록으로 이해할 수 있지만 기능 (아마도 생성자)으로 구분하는 것이 더 읽기 쉽습니다. – BrenBarn

+1

목록 이해력을 사용하는 것이 가능하지 않다고 생각합니다. 매개 변수는 단일 이해 내역에 미치기까지 광범위합니다. – James

+0

함수를 정의하여 목록 이해에 사용할 수 있습니까? – blacksite

답변

0

확인해보세요.

import math 

Nmax = 100 
primeLst = [2, 3, 5] 


result = [] 
enumMax = [int(math.floor(math.log(Nmax)/math.log(i))) for i in primeLst] 

def prod(i, curRes): 
    if curRes > Nmax: 
     return 
    if i==len(primeLst): 
     result.append(curRes) 
    else: 
     for j in range(enumMax[i]+1): 
      prod(i+1, curRes * (primeLst[i]**j)) 

prod(0, 1) 

# result: [1, 5, 25, 3, 15, 75, 9, 45, 27, 81, 2, 10, 50, 6, 30, 18, 90, 54, 4, 20, 100, 12, 60, 36, 8, 40, 24, 72, 16, 80, 48, 32, 96, 64] 
+0

'2 ** 0 * 3 ** 0 * 5 ** 2 = 25' 이후 결과에 '25'가 없어야합니까? – niemmi

+0

죄송합니다. 감사!! – TurtleIzzy

1

요인 중 하나를 선택하고 합계가 제한값을 초과 할 때까지 현재 합계를 곱하는 재귀 함수를 사용할 수 있습니다. 반복 할 때마다 다음 요소로 이동하면서 재귀 적으로 동일한 함수를 호출 할 수 있습니다. 당신이 모든 요소를 ​​소진하면 바로 현재의 합계를 산출 :

def prods(factors, limit, index = 0, total = 1): 
    # Base case, yield current number 
    if index >= len(factors): 
     yield total 
     return 

    while total <= limit: 
     # Python 3 yield from could be used 
     for res in prods(factors, limit, index + 1, total): 
      yield res 
     total *= factors[index] 

print list(prods([2, 3, 5], 100)) 

출력 : @의 niemmi의 대답이 수정에 재귀 호출의 각에서 시퀀스의 각 병합 heapq.merge를 사용

[1, 5, 25, 3, 15, 75, 9, 45, 27, 81, 2, 10, 50, 6, 30, 18, 90, 54, 4, 20, 100, 12, 60, 36, 8, 40, 24, 72, 16, 80, 48, 32, 96, 64] 
0

:

from heapq import merge 

def prods(factors, limit, index = 0, total = 1): 
    # Base case, yield current number 
    if index >= len(factors): 
     yield total 
     return 
    iters = [] 
    while total < limit: 
     iters.append(prods(factors, limit, index + 1, total)) 
     total *= factors[index] 
    for res in merge(*iters): 
     yield res 

print list(prods([2, 3, 5], 100)) 

가 출력이됩니다 : 증가하는 순서로 제품을 생산

>>> print list(prods([2, 3, 5], 100)) 
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96]