编辑:我稍微改变了我的问题,使其更加通用,即p [i] [j]中的i也可以改变。
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 :(得分:2)
您可以在不使用索引的情况下进行迭代:
for row in p:
for j in range(len(row)):
row[j] = row[j - 1 % len(row)] * c1 + row[j] * c2
我留给你,以决定你是否有更好的方法来操作单行。
如果你想在行和列之间交叉引用,那么不,没有特别好的方法来做到这一点,除非你想使用像numpy这样的东西。
答案 1 :(得分:2)
如果你不想要两个嵌套循环,你可以循环遍历行并使用“list comprehension”构建每个替换行(也恰好使用关键字for
):
for i in range(len(p)):
p[i] = [ p[i][j-1]*c1 + p[i][j] * c2 for j in range(len(p[0])) ]
由于你是python的新手,我会添加一些建议:
a)使用两个嵌套的for循环没有错。在我看来,他们是写出你的榜样的最好(最清晰,最优雅)的方式。
b)你确实意识到1%len(p [0])是一个常数,对吧?但是你可能没有意识到row[i- 1%len(row)] == row[i-1]
在p只有一列的情况下(因为索引-1的工作方式)
答案 2 :(得分:0)
使用map
和lambda
的组合可以解决问题。