2012-03-31 7 views
2

私はmatrixをゼロで埋めようとしています。生憎、次の例では、変数xyはredundandです:リストを掛けるリストの理解でマトリックスを作成する際の冗長変数

self.matrix = [[0 for x in range(0, self.N)] for y in range(0, self.N)] 

が、私は期待していないものです当然のものだけを参照をコピーします。だから、

>>> matrix = [[0] * 5] * 5 
>>> matrix 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> matrix[1][1] = "X" 
>>> matrix 
[[0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0], [0, 'X', 0, 0, 0]] 

、どんな解決策があります冗長変数(x & y)を避けるためにリストの理解を使用していますか?ご覧のとおり

[[0]*self.N for _ in range(self.N)] 

は、我々は[0]*sizeイディオムを使用することができます。

+1

@Ashwini:どのように役立ちますか? –

+0

もし私が間違っていないなら、彼の問題は、特定のリスト項目に値を追加するときに、それはmatrixという名前のリスト内の他のリストにも追加されるということです。 およびhttp://stackoverflow.com/a/8713681/846892では、この動作を説明しています。 –

+2

@AshwiniChaudhary:彼はその行動について知っています。質問はまったく別のものですが... –

答えて

5

共通のイディオムは、値が使用されませんあなたのコードの可能性のある読者を知らせる変数_に結果を割り当てることです0は不変の値であるため、内側のリストの場合また、引数が1つのみのrangeを呼び出すこともできます。この場合、上限は0、下限は0となります。

したい場合は、あなたが自分で任意のネストの深さのリストを作成サポートリストビルドヘルパー構築することができます:

def make_multi_list(dim, func): 
    if not dim: return func() 
    return [make_multi_list(dim[1:], func) for _ in range(dim[0])] 

使用法:代わり

>>> make_multi_list((2, 2), lambda: 0) 
[[0, 0], [0, 0]] 
>>> make_multi_list((3, 2, 1), lambda: 0) 
[[[0], [0]], [[0], [0]], [[0], [0]]] 
+0

ありがとう、それは私が探しているものです!そして、あなたが私を得たとても良い例です。 – IProblemFactory

1

を、あなたができる:

 
from itertools import repeat 

self.matrix = [list(repeat(0, self.N)) for _ in range(0, self.N)] 
+1

ありがとうございます。私はコードを修正しました。言語がすでにこの機能をサポートしている場合、リピート機能を使用する必要はありません。 –

関連する問題