2016-10-28 3 views
0

35 (m)까지 합친 10 개의 주사위 (n)의 모든 순열을 알아야합니다. 나는 파이썬에 익숙하지 않고 for 반복문에 붙어있다.설정된 범위와 합계를 가진 주사위의 모든 순열

import itertools 

dice = [1,2,3,4,5,6] 

def subsets(n,m): 

    perms = itertools.permutations(dice,n) 
    for i in perms: 
     if sum(i) == m 
     yield perms 
    else: 
     return 

print(list(subsets(10,35))) 
+0

'if'뒤에 콜론과 들여 쓰기를 넣으십시오. 'else : return'을 버리십시오. 왜 그걸 원하니? –

답변

0
from itertools import product 

dice = [1, 2, 3, 4, 5, 6] 

def subsets(n, m): 
    for i in product(dice, repeat=n): 
     if sum(i) == m: 
      yield i 

그래서, 당신은 당신의 코드에서 여러 가지 문제가 있습니다 : 이것은 내가 지금까지있어 무엇 루프를 잘 작성하지 위해

  • 를, 그것은 필요 코드 블록이다 적절한 들여 쓰기와 세미콜론.
  • if 블록의 else 부분이 for 루프 들여 쓰기 레벨에서 잘못 설정되었습니다.
  • 그냥 돌아 오는 else 문은 함수 실행을 종료합니다.
  • 순열 객체를 생성하면 for 루프의 인스턴스를 생성해야합니다.
  • N 개의 오지의 조합을 얻으려면 itertools.product이 필요합니다.
+0

당신은'product' 모듈에 대해 실제로 옳았습니다. 이제는 하위 집합 내의 모든 목록에있는 항목을 곱한 다음 평균을 구해야합니다. 그러나 출력이 너무 커서 콘솔이 멈 춥니 다. 말하자면,'combine_with_replacement'에 각리스트에 대한 순열의 수를 곱한 값을 반환하여'product' 출력까지 요약 할 수 있습니까? 고맙습니다. – Lema

0

Dalvenjia는 itertools 기능을 사용하는 것을 제외하고는 올바른 아이디어가 있습니다. n 주사위를 굴리려면 itertools.product(dice, repeat=n)을 사용해야합니다.

+0

그는 N 개의 주사위에있는 모든면의 가능한 조합이 M 개까지 얼마나되는지를 알아야합니다. 주사위를 굴리지 않고 이해 한 것입니다. – Dalvenjia

+0

@Dalvenjia 그건 같은거야. 'print (list (itertools.combinations ([1, 2, 3, 4, 5, 6], 10)))')하면'[]'이됩니다. –

+0

네 말이 맞아, 나는 고쳐 놨어. – Dalvenjia

2

첫 번째 문제는 순열을 원하지 않는다는 것입니다. 순열은 중복을 포함하지 않습니다 (즉, 각 주사위가 다른 숫자를 굴립니다). 10 개의 주사위 굴림 순열이 없습니다.

이 대신해야 하나 product (그렇지 않을 경우) 또는 combinations_with_replacement (다르게 (1,1,1,1,1,2)(1,1,1,1,2,1)을 계산하려는 경우). 나는 후자를 가정한다 *.

 if sum(i) == m 
    yield perms 

는 콜론과 들여 쓰기 블록이 있어야한다 :

그런 다음, 여기에 구문 오류가 있습니다. 함수가 어쨌든 마무리 때문에,

 if sum(i) == m: 
     yield i 

이 아무것도하지 않는 :

else: 
    return 

따라서는, 함수의 고정 된 버전은 다음과 같습니다 또한, 아마 현재 항목 (i)를 산출한다

def subsets(n,m): 
    return (p for p in itertools.combinations_with_replacement(dice,n) if sum(p) == m) 
: 간단하게 할 수 물론
def subsets(n,m): 
    perms = itertools.combinations_with_replacement(dice, n) 
    for i in perms: 
     if sum(i) == m: 
      yield i 

, 16,


* combinations_with_replacement를 사용하는 반면, 당신은 (141 개) 결과를 얻을, product, subsets(10,35) 수익률 4,395,456 결과가 유의하십시오.

+0

당신은 combination_with_replacements vs permutations에 대해 절대적으로 옳았습니다. 완벽하게 작동합니다. – Lema

+0

질문이 하나 더 있습니다. 결과 : (numpy.product (subsets, axis = 1)), 결과를 다른 변수에 저장 한 다음 '제품'을 적용해야합니다. 모듈, 맞나요? 함수 안에 모두 삽입 할 수 있습니까? @zvone – Lema