2010-11-19 5 views
12

6x5の2次元配列を作成しますが、最初は各セルにNoneを指定します。私はファイルを読んで、Nonesをデータで置き換えました。私は空の配列を最初に作成します。なぜなら、私が読んでいるファイルでデータが未定義の順序になっているからです。私の最初の試みは、私がこれをしなかった:Pythonで2次元行列を作成する

x = [[None]*5]*6 

私は今、リストの*演算子は参照の代わりにコピーを作成する可能性があるためであることを理解いくつかの奇妙なエラーをもたらしました。

この空の配列を作成する簡単なライナーはありますか?私はちょうどループのためにいくつかやってビルドすることができますが、それはPythonのために不必要に冗長なようです。ネストされた理解のリストを使用して

+3

、あなたは少なくともnumpyのが存在することを認識しておく必要があります。http ://numpy.scipy.org/もちろん入れ子リストには何も問題はありません。numpyのような(大きな)依存関係を追加することは必ずしも良いことではありません。しかし、あなたがすでにそれについて知っていないなら、まあ、今あなたはしています! –

答えて

22

x = [[None for _ in range(5)] for _ in range(6)] 
19

ここで何が起こっているがライン

x = [[None]*5]*6 

はあなたが6のリストを持っている。この時点で

x = [[None, None, None, None, None, None]]*6 

に出て展開するということですシングルトンとは異なる参照None。また、内側のリストへの参照が最初で唯一のエントリであるリストがあります。それを6倍にすると、理解しているように内側のリストへの参照が5つ増えています。しかし、ポイントは内部リストの問題はありません。内側のリストの構築を拡張して理解する必要はありません。

x = [[None]*5 for _ in range(6)] 

これは、リストへの参照の複製を避け、わかりやすく簡潔にしています。

1

あなたがnumpyのルートを進んでいない場合は、辞書との偽の2次元配列することができます:あなたはn次元配列を扱っている場合は

>>> x = dict(((i,j),None) for i in range(5) for j in range(6)) 
>>> print x[3,4] 
None 
関連する問題