2017-01-26 11 views
0

私は、グリッド内の4つの隣接する数字のすべての可能な組み合わせの中で最大の製品を見つけることを含む、オイラープロジェクトの問題11に取り組んでいます。私は、ネストされたリストの中に数字を分割し、このような関連番号、スライスするリスト内包を使用しました:Pythonリストの理解を使用してネストされたリストを反復する

if x+4 <= len(matrix[x]): #check right 
    my_slice = [int(matrix[x][n]) for n in range(y,y+4)] 

を...というように、他の基本的な方向のため。ここまでは順調ですね。しかし、私が対角線に着くと、問題が発生します。私はこのような二つの範囲を使用してみました:

if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
    my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 

をしかし、これは次のエラー生成:xの

<ipython-input-53-e7c3ebf29401> in <listcomp>(.0) 
48  if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
---> 49   my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 
ValueError: too many values to unpack (expected 2) 

私の希望の指標を、[0,0]のyの値は['0,0','1,1','2,2','3,3']だろう。これは、列挙関数を使ってリストを反復するのには違いはありませんが、明らかに何か不足しています。

P.S.私のひどい変数命名法に対する私の謝罪、私は進行中の仕事です。

+1

範囲を圧縮してみますか? – JETM

+0

* arrays *や* lists *を使って作業していますか?彼らは同じことではありません。 –

+0

説明していただきありがとうございます。実際はネストされたリストです。反映するように編集。 – SgtStens

答えて

0

あなたは、単に1を使用し、二つの範囲を使用し、それを2回適用する必要はありません。

my_slice = [int(matrix[m][m-x+y]) for m in range(x,x+4)] 

をごnので、我々は常にの違いがあることを知っているrange(y,y+4)を添付することになっていますy-xmnの間。したがって、2つの変数を使用する代わりに、違いを自分自身で解決できます。

それとも、まだ2つのrange(..)構文を使用したい場合には、あなたがzip(..)を使用することができ、発電機のリストを取り、同時にそれらを消費し、タプルを発する:

my_slice = [int(matrix[m][n]) for m,n in zip(range(x,x+4),range(y,y+4))] 

しかし、私はこれがあるため、パフォーマンスは向上しませんだと思いますタプルパッキングとアンパックオーバーヘッドの

+0

/facepalmはxとyの範囲を認識しないため、常に同じです。これは学習目的に過ぎないので、パフォーマンスについてあまり心配していません。ありがとう、受け入れられる! – SgtStens

0

[int(matrix[x+d][n+d]) for d in range(4)]対角線1つ。
[int(matrix[x+d][n-d]) for d in range(4)]

Btwでは、標準のマトリックスインデックス名、つまり行iと列jを使用することをお勧めします。 xおよびyではない。ややこしい。私は、たとえあなたのif x+4 <= len(matrix[x])xを2番目の次元の長さに対してテストしますが、最初の次元でそれを使うなど、自分自身を混乱さえすると思います。ハァッ?

+0

建設的な批判のおかげで、私が自分自身を混乱させるのは初めてではないでしょう。私は変数/インデックスの命名に苦労します。 – SgtStens

関連する問題