2016-10-28 3 views
0

合計35(m)の合計10個のダイス(n)のすべての順列を調べる必要があります。私は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 

だから、あなたのコード内のさまざまな問題があります:これは私がこれまで持っているものであるループは適切ではないため

  • ザ・を、それが必要なコードブロックがあります適切なインデントとセミコロン。
  • ifブロックのelse部分がforループインデントレベルで間違って設定されています。
  • 返されたelse文は、関数の実行を終了します。
  • あなたは順列オブジェクトを生成しているので、forループのインスタンスを生成する必要があります。
  • N個のダイスを組み合わせるにはitertools.productが必要です。
+0

あなたは実際には 'product'モジュールについて実際にはありました。私は今、 'サブセット'内のすべてのリスト内のアイテムを乗算し、その平均値を見つける必要がありますが、出力が大きすぎるとコンソールがフリーズします。例えば、 'combined_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(あなたが異なっ(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): 
    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 


* combinations_with_replacementを使用してのに対し、あなたは141件の結果を得る、productsubsets(10,35)利回り4395456の結果とのことに注意してください。

+0

あなたは置換と組替えとの順列に関して絶対に正しいです。それは完璧に動作します。 – Lema

+0

もう1つ質問があります。例えば、result =(numpy.product(subsets、axis = 1))のように、関数 'subsets'内のリストの値を掛ける必要がある場合、まず結果を別の変数に格納してから 'product'モジュール、正しい?関数の内部にすべて挿入することはできますか? @zvone – Lema

関連する問題