2017-01-26 70 views
0

我正在研究Euler Project,问题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))] 

但是,这会产生以下错误:

<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) 

我对X期望指标的[0,0] y值将是['0,0','1,1','2,2','3,3']。使用枚举函数遍历列表似乎并没有什么不同,但显然我错过了一些东西。

P.S.我为可怕的变量术语表道歉,我正在进行一项工作。

+1

尝试压缩范围? – JETM

+0

你正在处理*数组*还是*列表*?它们不是同一件事。 –

+0

谢谢您的澄清,实际上它是一个嵌套列表。编辑来反映。 – SgtStens

回答

0

你并不需要使用两个范围,只需使用一个,并将其应用两次:

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

由于您的n应该是连接range(y,y+4)我们知道,总是会有的差异y-xmn之间。因此,我们不用两个变量,而是可以自己抵消差异。

或者如果你仍然想使用二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)]对于一个对角线。
[int(matrix[x+d][n-d]) for d in range(4)]其他。

顺便说一句,更好地使用标准矩阵索引名称,即行i和列j。不是xy。这很混乱。我认为你甚至会迷惑自己,例如你的if x+4 <= len(matrix[x])测试x与第二维长度相反,但在第一维中使用它。咦?

+0

这不会是我第一次迷惑自己,谢谢你的建设性批评。我为变量/索引命名而努力。 – SgtStens