2017-09-03 4 views
3

私は、2つのリストに対していくつかの連続した操作を実行するPythonで書かれた関数を持っています。問題は、これらの関数の実行中にランダムな時間に、彼らは間違った答えを与えることです。関数内のコードはリストのPythonの連続操作が間違った順序で実行される

def temp(c, p): 
    random.seed(0) 
    x = random.randint(0 , len(c)-1) 
    y = random.randint(0 , len(c)-1) 

    s_1 = c[x][0] 
    s_2 = c[y][0] 

    p[x] += [s_1] 
    p[y] += [s_2] 
    p[x].remove(s_2) 
    p[y].remove(s_1) 

    c[x], c[y] = c[y], c[x] 

    return c, p 

def anotherFunction(): 
    iter = 1000 
    for i in iter: 
     c_main, p_main = temp(c, p) 

です。リストのリストは0からnの範囲です。例えば、Cは、以下の

c = [[7], [6], [1], [2], [5], [4], [0], [3]] 

そしてpが含まもcであるれindexで点を除い0からnまでの全ての数を含むリストのリストです。

p = [[0, 2, 4, 6, 5, 1, 3] 
    [0, 1, 2, 3, 4, 5, 7] 
    [0, 2, 3, 4, 6, 7, 5] 
    [0, 1, 3, 5, 6, 7, 4] 
    [0, 2, 4, 6, 7, 3, 1] 
    [0, 1, 2, 3, 6, 7, 5] 
    [1, 2, 3, 4, 5, 6, 7] 
    [0, 1, 2, 4, 5, 6, 7]] 

これは、関数内の任意の点に値を設定する方法です。つまり、idxの値がcの場合、一覧にはidxpには含めないでください。 しかし、関数の実行中に、xyで選択された値がスワップされますが、他の値も影響を受けます。これは、2つのリストが時々

c = [[3], [1], [4], [5], [7], [0], [2], [6]] 
p = [[0, 1, 2, 4, 5, 6, 7] 
    [0, 2, 3, 4, 5, 6, 7] 
    [0, 1, 2, 3, 6, 7, 4] 
    [0, 1, 2, 3, 6, 5, 5] 
    [0, 1, 2, 3, 4, 6, 7] 
    [1, 2, 3, 4, 6, 7, 5] 
    [0, 1, 3, 4, 5, 6, 7] 
    [0, 1, 2, 3, 4, 5, 7]] 

私はこれらの連続的な操作は、互いの影響を受け得ているかを理解することができませんでしてるように見える方法です。この関数は別の関数のループ内で呼び出されます。

UPDATE: 私はもっと慎重に私のコードをデバッグし、ループのための2つ以上の値がxyに加えてcにスワップ取得のいくつかの反復であることを実現しました。これらの値はスワップされますが、一部の実行ではpに更新されないため、出力が正しく表示されません。 2つの値が交換されている理由

+3

[MCVE]を提供してください明確な問題陳述書があります。あなたはどんな結果を見ていますか?どのような結果があなたに*期待していますか*。 –

+1

'ランダムを設定します。あなたの結果を再現できるようにします。ありがとう。 –

+0

私の質問を編集し、 'random.seed(0)'という文を追加しました – user5340

答えて

2

コードが完全ではありません。

あなたはこのようなあなたの関数を呼び出すためにシーム:rangeを追加し、Pの各ラインのためのカンマを追加します。あなたのコードを固定した場合:

c = [[3], [1], [4], [5], [7], [0], [2], [6]] 
p = [[0, 1, 2, 4, 5, 6, 7], 
    [0, 2, 3, 4, 5, 6, 7], 
    [0, 1, 2, 3, 6, 7, 4], 
    [0, 1, 2, 3, 6, 5, 5], 
    [0, 1, 2, 3, 4, 6, 7], 
    [1, 2, 3, 4, 6, 7, 5], 
    [0, 1, 3, 4, 5, 6, 7], 
    [0, 1, 2, 3, 4, 5, 7]] 

for i in range(1000): 
    c_main, p_main = temp(c, p) 

ノート。

temp()の機能の中では、の内容がに変更されています。 あなたはあなたが期待するものを持っていないかもしれません。各繰り返しで同じpを再利用するためです。時には矛盾することもあります。

cols = [[3], [1], [4], [5], [7], [0], [2], [6]] 
print(temp(cols)) 

は、あなたが得る:

import random 

def temp(c): 
    # -- raw matrix 
    p = [[col for col in range(8)] for row in range(len(c))] 

    # -- drop a number 
    for p_row, c_row in zip(p, c): 
     p_row.pop(c_row[0]) 

    # -- shuffle 
    for row in p: 
     random.shuffle(row) 

    return p 

あなたはこのようにそれを使用することができます:あなたが欲しい

は、確かにそのようなことである

[[6, 1, 4, 5, 7, 2, 0], 
[3, 0, 5, 4, 2, 7, 6], 
[2, 7, 0, 3, 6, 5, 1], 
[1, 2, 7, 4, 6, 3, 0], 
[3, 1, 4, 6, 2, 0, 5], 
[4, 5, 6, 3, 7, 1, 2], 
[0, 6, 1, 5, 7, 3, 4], 
[4, 3, 7, 0, 1, 5, 2]] 
+0

あなたはpが矛盾するかもしれません。しかし、すべての反復で同じpを使用します。それは私の質問にコードをコピーしたときに間違いであったに違いない。 – user5340

+0

'temp(p)'は同じ_p_を使用して呼び出すので、その項目は関数内で変更されます。関数内に_p_のコピー(deepcopy)を作成する必要があります。 –

+0

問題はPythonの[Mutable Default Arguments](http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments)に似ています。それは一般的なゴチャです。 –

関連する問題