-1

Python 2.7で作業しています。

コードは少し扱いに​​くいと思いますが、できるだけ簡単に説明しようと思います。

私は2つのリストを持っています:

T = [[1,0], [1,0], [0,5]]
S = [[1], [3], [2]]

B の対応する値を T の対応するリストの末尾に追加する必要があるため、zip を使用してそれらをまとめます。

次に、各リストの最初の値を 3 番目の値から差し引いた結果を計算し、別の zip 関数を使用してその値を追加します。

したがって、関数を実行すると、T 変数は [[1,0,1,0], [1,0,3,-2], [0,5,2,-2]] のようになります。

次に、特定の値が他の値よりも高いか低い場合に、リストが勝ち、負け、または引き分けを返す一連の if ステートメントがあります。

関数 (starterTrans) の結果を複数回シミュレートしたいと思います。問題は、私が使用するときです:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T, S)

シミュレーションごとに異なるバージョンの T を取得しています。そのため、最初のシミュレーションでは、T は各リストに適切な数の要素 (4 つ) を持っていますが、実行するたびに、ますます多くの変数が追加されます。

何度使用しても、T を元の 4 つの変数にロックする方法が必要です。そして、私はそうする方法を見つけるのに苦労しています。何か案は?

私は自分のコードが複雑であることを知っていますが、誰かが私の問題を説明する私の試みに従うのに役立つかどうかは次のとおりです。

def starterTrans(team, starter):
    wins = 0
    losses = 0
    nd = 0
    random.shuffle(team)
    for t, s in zip(team, starter):
        t.extend(s)
    score_add(team, exit_score(team, starter))
    length = len(starter)
    for i in range(0, length):
        if team[i][4] > 0 and (team[i][1] > -team[i][4]) and team[i][2] >= 5:
            wins += 1
        elif team[i][4] < 0 and (team[i][1] <= -team[i][4]):
            losses += 1
        elif (team[i][4] <= 0 and team[i][1] >= -team[i][4]):
            nd += 1
    return wins, losses, nd

def score_add(team, exit_scores):
    for t, e in zip(team, exit_scores):
        t.append(e)
    return team

def exit_score(team, starter):
    exit_scores = []
    length = len(starter)
    for i in range(0, length):
        score = team[i][0]-team[i][3]
        exit_scores.append(score)
    return exit_scores

def MonteCarlo(team, starter, x):
    for i in range(0, x):
        starterTrans(team, starter)

助けてくれてありがとう。

4

2 に答える 2

1

これを変更するだけでよいと思います:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T, S)

これに:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T[:], S)

これにより、元のリストの代わりにTtoのコピーが渡されます。starterTrans(..)の要素を編集している場合TstarterTrans(..)これは役に立ちません。ここでは、ディープ コピーが必要になります。浅いコピーと深いコピーの違いについては、こちらをご覧ください:深いコピーと浅いコピーの違いは何ですか? .

于 2011-11-04T22:31:01.923 に答える
0

最後の行をに変更しstarterTrans(team[:], starter)ます。これにより、チームのコピーが渡され、元のファイルはそのまま残ります。

于 2011-11-04T22:05:37.753 に答える