2012-02-24 104 views
2

编辑:我已经改变了我的问题稍微使之更加普遍,从而在P中的I [i] [j]也可以改变。优雅的方式来操纵列表中的列表?

很新的Python的。我有一个列表,这使得4排5列网格内[长度相等]列表:

p = [[1.0, 3.0, 4.0, 1.0, 1.0], 
    [1.0, 1.0, 5.0, 1.0, 1.0], 
    [1.0, 6.0, 6.0, 1.0, 1.0], 
    [1.0, 4.0, 1.0, 1.0, 6.0]] 

为了操纵每个单元格,我现在正在做的是这样的:

for i in range(len(p)): 
    for j in range(len(p[0])): 
     p[i][j] = p[i][j - 1] * c1 + p[(i + 1) % len(p)][j] * c2 

我的问题是:有没有更好的方法来写这个,而不是在另一个for循环中有for循环?也许使用lambda?

+0

你想对细胞做什么?我大概可以从你正在做的事情中弄清楚你的意图,但这并不明显。 – Kimvais 2012-02-24 14:11:09

+0

我想像在代码中一样操纵它们:'p [i] [j] = p [i] [j - 1%len(p [0])] * c1 + p [i] [j] * c2'但我想摆脱在一个for。 – ksindi 2012-02-24 14:12:08

+0

也许用'xrange'替代'range'。 – hochl 2012-02-24 14:12:44

回答

2

如果你不想要两个嵌套的循环,你可以遍历行和使用“列表理解”构建每次更换行(这也恰好使用关键字for):

​​

由于你是新来的蟒蛇,我会添加一些建议:

一)没有什么错误使用两个嵌套的for循环。在我看来,他们是编写你的例子的最好(最清晰,最优雅)的方式。

b)你要明白,1%LEN(P [0])是常数,是吗?但你可能没有意识到即使在p只有一列的情况下(因为索引-1工作的方式)row[i- 1%len(row)] == row[i-1]

c)有人提出了看numpy数组的好建议(但删除了回答)。我第二它。

0

使用的maplambda组合可能做的伎俩。

2

可以遍历不使用索引:

for row in p: 
    for j in range(len(row)): 
     row[j] = row[j - 1 % len(row)] * c1 + row[j] * c2 

我让你来决定是否有让你在同一行上运行一个更好的办法。

如果你想行和列之间进行交叉参考,则没有,有没有更好的特别的方式来做到这一点,除非你想使用类似numpy的。

+0

感谢您的回复。我已经稍微改变了我的问题,以使它更一般化,从而我在p [i] [j]中的i也可以改变。 – ksindi 2012-02-24 14:34:08