2011-12-20 7 views
1

膨大なリストを作成する最も簡単な方法を考え出したいと思います。巨大なリストに複数の列挙を組み合わせた変数を作成する

私は3つの六面ダイスを持っているとしましょう、それぞれはrandint(1,6)の値を持っています。 私はこれらの3つの数字を組み合わせる可能な方法をすべて網羅した値のセットが必要なので、die1 * die2 + die3またはdie1 ** die3 - die2などとなります。

定義したいそういうわけで、私はdie1 Z die2 Z die3と言うことができ、それを打ち込むことなく私に巨大なリストを与えるでしょう。これはPythonで可能ですか?どんなアイデアでも大歓迎です。

+2

あなた自身をより明確に表現してください。あなたは何を達成したいですか?変数はどのようにいくつかの操作に等しいでしょうか?それは実際にはどういう意味ですか? – Marcin

+0

私はリストの理解のようなものが必要だと思う、私はちょうど数字の代わりに操作でそれを行う方法を知らない。 – ritchie3237

答えて

2

ここで知っている重要なことは、あなたが他の関数に(または、リスト内の)引数として関数を渡すことができるということです。この問題が解決しやすくなることを理解したら、

あなたはリスト内包する場合:ゼロによる除算が正常に発生したであろう「None」を含まない

from operator import add,sub,mul,div 
funcs = [add,sub,mul,div] 
die = [1,2,3,4,5,6] 

results = [f(x,y) if y != 0 else None for x in die for y in [g(z,w) for z in die for w in die for g in funcs] for f in funcs] 

注意を。

これを関数に分割すると、より明確になります。数値と操作リストの2つのリストを取り、すべての結果を返します。

def results(funcs, xs, ys): 
    out = [] 
    for f in funcs: 
    for x in xs: 
     for y in ys: 
     try: 
      out.append(f(x,y)) 
     except ZeroDivisionError: 
      pass 
    return out 

これはゼロ除算が発生した場合は何もありません。すべての結果を得るには、results(funcs,die,results(funcs,die,die))のようにしてください。

これらはどちらも結果に重複がありますので、実際に何をしたいのかによってはlistの代わりにsetが必要な場合があります。

また、ちょうどそれを考え、しかし、あなたが行うことを計画しているものに応じてあなたの代わりに発電返すようにresultsを得ることができる:あなたがだけが本当に大きな結果セットを作業している場合は

def results(funcs, xs, ys): 
    for f in funcs: 
    for x in xs: 
     for y in ys: 
     try: 
      yield f(x,y) 
     except ZeroDivisionError: 
      pass 

をそれらを1つずつ見たいと思っています。これはリスト全体を構築するよりも良い選択肢です。

+1

独自の操作を再定義するのではなく、['operator'](http://docs.python.org/library/operator.html)標準モジュールが便利です。 –

+0

良い。私はそれが存在するのか分からなかった。私はそれを解決するでしょう! – mange

+0

本当にありがとう、ありがとう。重複は問題ではありません - 私はゲームに取り組んでいます。私は何を得ているのかをより良く理解するために説明します。 3つのダイスを手に入れようとしているターゲット番号が100であるとします。あなたの3つのサイコロの値が1,1,1であれば、100の目標を得ることはできません。だから私はあなたが得る可能性のある全ての数のリストを生成し、プレイヤーがそのリストに与える答えを比較したい。だからゲームをプレイしていた人がたとえそれを得ることができなかったとしても100をタイプしたとすれば、ゲームは不可能であると彼らに伝えるだろう。 – ritchie3237

0

私はあなたがデカルト製品の演算子をpythonで最適にオーバーロードする方法を尋ねようとしていると思います。

itertoolsからproductを使用してみてください:

from itertools import * 
die_outcomes = [1,2,3,4,5,6] 
list(product(product(die_outcomes, die_outcomes), die_outcomes)) 
関連する問題