2016-10-28 75 views
0

我需要找出所有10個骰子(n)的總和爲35(m)的排列組合。我是python的新手,陷入了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 

所以,你必須在你的代碼的各種問題:

  • for循環是不正確的,它是需要一個代碼塊正確的縮進和分號。
  • if塊的else部分錯誤地設置在for循環縮進級別。
  • 剛剛返回的else語句會結束函數的執行。
  • 您正在生成置換對象,您應該生成for循環的實例。
  • 您需要itertools.product才能獲得N個骰子的可能組合。
+0

你真的對「產品」模塊是正確的。我現在需要在「子集」中的每個列表中乘以項目,然後找到它們的意思,但是,輸出太大會導致控制檯凍結。有沒有辦法,例如,返回'combination_with_replacement'乘以每個列表的排列數,以便它們總和爲'product'輸出?謝謝。 – Lema

0

Dalvenjia除了使用itertools函數外,還有其他正確的思路。如果你想擲骰子n,你需要使用itertools.product(dice, repeat=n)

+0

他需要知道N個骰子中所有邊的多少個可能的組合加起來爲M.這就是我所理解的,而不是擲骰子。 – Dalvenjia

+0

@Dalvenjia這是一回事。如果你打印(列表(itertools.combinations([1,2,3,4,5,6],10)))''你得到'[]'。 –

+0

你說得對,我站好了。 – Dalvenjia

2

第一個問題是你不想排列。排列不包括重複項(即每個骰子滾動不同的數字)。沒有10個擲骰子的排列組合。

這應該改爲product(如果要計算(1,1,1,1,1,2)(1,1,1,1,2,1)的不同)或combinations_with_replacement(如果不這樣做)。我假設後者*。

然後,有一個語法錯誤的位置:

 if sum(i) == m 
    yield perms 

應該有一個冒號和縮進塊。此外,它應該可能產生電流項(i):

 if sum(i) == m: 
     yield i 

這什麼也不做,因爲函數無論如何都會完成:

else: 
    return 

因此,該功能的固定的版本將是:

def subsets(n,m): 
    perms = itertools.combinations_with_replacement(dice, n) 
    for i in perms: 
     if sum(i) == m: 
      yield i 

當然,這可以被簡化爲:

def subsets(n,m): 
    return (p for p in itertools.combinations_with_replacement(dice,n) if sum(p) == m) 

*請注意,productsubsets(10,35)產量4395456個結果,而使用combinations_with_replacement你得到141個結果。

+0

你對combination_with_replacements vs permutations絕對正確。那完美的作品。 – Lema

+0

我還有一個問題。如果我需要乘以函數子集內的列表中的值,例如:result =(numpy.product(subsets,axis = 1),我需要先將結果存儲在另一個變量中,然後應用'product'模塊,是否正確?是否可以將它全部插入到函數中? @zvone – Lema