优雅的方式来操作列表中的列表?

时间:2012-02-24 14:06:32

标签: python

编辑:我稍微改变了我的问题,使其更加通用,即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?

3 个答案:

答案 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的工作方式)

c)有人提出了很好的建议,看看numpy Arrays(但后来删除了答案)。我是第二个。

答案 2 :(得分:0)

使用maplambda的组合可以解决问题。