2013-06-10 3 views
3

매번 반복단순화 파이썬은 내가 그런 내가 파이썬에서이 작업을 수행 요소의 특정 수의 특정 제품을 찾는 일부 수학 문제를 해결하려고

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 가지 요인에 대한 것이지만, 더 많은 요소를 더하면 더 길고 반복적으로 코드가 계속 유지됩니다. 이 간단한 유형의 문제에 대한 코드를 단순화하는 방법에 대한 아이디어가 있습니까? 감사합니다.

+0

'product == 36' (따옴표 없음)을 의미합니까? – arshajii

+0

제품 == "36": 오류로 보입니다. – Nimajen

+0

예, 미안합니다. 그게 바로 제가 말한 것입니다. –

답변

5

Itertool의 cartesian product은 복수 중첩 루프의 효과를 시뮬레이션합니다.

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) 

결과 : 범위는 항상 x, y, z의 각각에 대해 동일한 경우

factors : 1,4,9 
factors : 1,6,6 
factors : 1,9,4 
(...etc) 

, 당신은 단지 한 번 지정할 수 있습니다

for x, y, z in itertools.product(range(1,10), repeat=3): 

당신이 만약 ' product = 줄에 수십 개의 별표를 입력하는 데 아쉬운 점이 있다면 을 사용하여 임의의 수의 인수를 곱할 수 있습니다.

당신의 형식 문자열이 다루기 힘든하게되면
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)) 
+1

이 경우에는 itertools.product 만 문제가 있습니다. 최적화하기가 어렵습니다. – oleg

+0

매우 깨끗하고 깔끔하게 보입니다. 고마워. –

4

x에서 y 시작함으로써 중복을 피하십시오. 다른 루프를 실행하는 대신 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) 

더 많은 요소가있을 경우 재귀 함수를 사용합니다.