2016-10-22 5 views
-2

こんにちは皆さん:私は今、Pythonの非常にトリックの問題があります。どのように修正するのか分かりません。Pythonのdictのサブセットを変更してください

問題はあるが、以下:

私はdictの()、のはそれを呼ぶことがありますD. Dのキーは、単位正方形の中心の座標を表し、整数(i、j)のペアがあり、 (i、j)に対応する値は色( 'r'、 'g'、 'b')の1つです。

私は2x2の正方形はすべて「赤」ので、私は書くために持っている、「青」に自分の色を変更した場合であれば、頻繁にチェックする必要があり、私のプログラムで

if (D[(i, j)] == 'red' 
    and D[(i, j+1)] == 'red' 
    and D[(i+1, j)] == 'red' 
    and D[(i+1, j+1)] == 'red'): 
    D[(i, j)] = .. = 'blue' 

まあ、本当状況はより複雑であり、上記は一例に過ぎない。

私はこの種のコードを何度も書く必要があります:すべて赤、すべて青、若干青、赤、....私は狂っています!ブロックする値を再割り当てするときに、元のセットが変更されないのでので、私はこれが動作しないコースの

block = [[D[(i,j)], D[(i, j+1)], D[(i, j+1)], D[(i+1, j+1)]] 
if block == ['red', 'red', 'red', 'red']: 
    block = ['blue', 'blue', 'blue', 'blue'] 

を書くことにした:D [(I、J)] 『赤」秒をまだ』。

私の質問は、私の状況でサブセットを効率的に変更する方法です。より正確に言えば、私はいくつかの(キー、値)ペアをdictから取り出し、一時変数(またはデータ構造)に格納し、これらの変数をチェックして変更し、元のdictを変更することを望みます変数。しかし、それはいつも私が期待していたものとは別の方法で働いていた

+0

は、いずれかの操作を行うdeepcopyだろうかより良い/異なる?元のコピーではなくコピーをまだ変更しています...実際にコピーがオリジナルから完全に切り離されていることを確認しているので、実際にはコピーは悪化する可能性があります。 – Julien

+1

最初の例で '=='を使って割り当てようとしています。他のものはどちらも動作できません。何をしたいですか?辞書の値を変更しますか?その場合、 'ブロック'を作成すると助けになることはありません。そして、なぜディクテーションの代わりに2D配列を作成しないのですか? –

+0

@ Jean-FrançoisFabre:これは私の状況を単純化したものに過ぎず、実際のプログラムははるかに複雑で、説明するのに多くの言葉が必要です。私はちょうどdictの部分をより効率的に変えたいと思う。 –

答えて

0

あなただけの関数を作っていないのはなぜ?

def is_2x2red(squares,x,y): 
    return (squares[(x,y)]=='r' and squares[(x,y+1)]=='r' and 
      squares[(x+1,y)]=='r' and squares[(x+1,y+1)]=='r') 

と青を割り当てるための1つ?

def blue2x2(squares,x,y): 
    squares[(x,y)]='b' 
    squares[(x,y+1)]='b' 
    squares[(x+1,y)]='b' 
    squares[(x+1,y+1)]='b' 

次にすべてを使いますか?

if is_red2x2(squares,i,j): blue2x2(squares,i,j) 

これらを組み合わせて1つの機能にすることで、通話時間を短縮することもできます。

編集 例えば小切手、あなたは2×2以上の間、この作業をする必要がある、とだけで今後の参考のために、チェックし、割り当てがループする必要がある場合は、次の

def is_red2x2(squares,x,y,n=1): 
    return reduce(lambda x,y: = x*y,(squares[(i,j)]=='r' 
        for i in range(x,x+n+1) for j in range(y,y+n+1))) 
+0

'blue2x2'はボルケンです。==比較する、=割り当てる –

+0

正解、ありがとう。コピー貼りが多すぎます。 – kabanus

1

あなたはそれを動作させるためにあなたのアイデアこの方法を適応させることができます。

block = [(i,j), (i, j+1), (i, j+1), (i+1, j+1)] 
if all(D[coord]=='red' for coord in block): 
    for coord in block: 
     D[coord] = 'blue' 
+0

あなたの答えとkabanusを組み合わせました。返信いただきありがとうございます。 –

関連する問題