Python 在列表中操作列表的优雅方式?

Python 在列表中操作列表的优雅方式?,python,Python,编辑:我稍微修改了我的问题,使其更一般化,因此p[I][j]中的I也可以更改 对Python来说非常陌生。我在一个列表中有[equal length]列表,它构成了一个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 r

编辑:我稍微修改了我的问题,使其更一般化,因此p[I][j]中的I也可以更改

对Python来说非常陌生。我在一个列表中有[equal length]列表,它构成了一个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?

使用
map
lambda
的组合可以达到目的。

使用
map
lambda
的组合可以达到目的。

您可以不使用索引进行迭代:

for row in p:
    for j in range(len(row)):
        row[j] = row[j - 1 % len(row)] * c1 + row[j] * c2
我让你来决定是否有更好的方法让你在一排进行手术


如果您想在行和列之间交叉引用,那么没有更好的方法,除非您想使用numpy之类的工具。

您可以在不使用索引的情况下进行迭代:

for row in p:
    for j in range(len(row)):
        row[j] = row[j - 1 % len(row)] * c1 + row[j] * c2
我让你来决定是否有更好的方法让你在一排进行手术


如果您想在行和列之间交叉引用,那么没有更好的方法,除非您想使用numpy之类的工具。

如果您不想要两个嵌套循环,您可以在行上循环,并使用“列表理解”构造每个替换行(这也恰好使用关键字
for
):

由于您是python新手,我将添加一些建议:

a) 使用两个嵌套for循环没有什么错。在我看来,它们是编写示例的最佳(最清晰、最优雅)方式

b) 你知道1%len(p[0])是一个常数,对吗?但是,即使在p只有一列的情况下(因为索引-1的工作方式),您可能也没有意识到
行[i-1%len(row)]==行[i-1]


c) 有人提出了查看numpy数组的好建议(但随后删除了答案)。我支持它。

如果您不想要两个嵌套循环,可以在行上循环,并使用“列表理解”构造每个替换行(这也恰好使用关键字
):

由于您是python新手,我将添加一些建议:

a) 使用两个嵌套for循环没有什么错。在我看来,它们是编写示例的最佳(最清晰、最优雅)方式

b) 你知道1%len(p[0])是一个常数,对吗?但是,即使在p只有一列的情况下(因为索引-1的工作方式),您可能也没有意识到
行[i-1%len(row)]==行[i-1]


c) 有人提出了查看numpy数组的好建议(但随后删除了答案)。我附议。

你想用这些电池做什么?我可能可以从你正在做的事情中看出你的意图,但这并不明显。我想像在代码中一样操纵它们:
p[I][j]=p[I][j-1%len(p[0])]*c1+p[I][j]*c2
,但我想在for中去掉for。也许用
xrange
替换
range
。用索引算法放慢速度
p[i+1%len(p)
给出了一个范围错误。您的意思是(i+1)%len(p)?@tuva-我早些时候建议使用numpy,但是为了说明它的价值,这个特定的问题实际上更清楚地写为嵌套循环。如果你没有在适当的位置修改数组,你会使用
numpy.roll
。因为你在适当的位置修改它,但这不是一回事。如果这段代码是一个性能瓶颈,我可以告诉你怎么做w用numpy来加速它。但是它的可读性会低很多。(老实说,如果你遇到性能问题,它非常适合cython。)你想用这些单元格做什么?我可能可以从你正在做的事情中看出你的意图,但这并不明显。我想像在代码中一样操纵它们:
p[I][j]=p[i][j-1%len(p[0])]*c1+p[i][j]*c2
但我想在for中去掉for。可能用
xrange
替换
range
。用索引算法放慢速度!
p[i+1%len(p)
给出了一个范围错误。你是指(i+1)%len p吗?@tuva-我早些时候建议使用numpy,但是为了说明它的价值,这个特定的问题实际上更清楚地写为嵌套循环。如果你没有在适当的位置修改数组,你会使用
numpy.roll
。因为你在适当的位置修改它,但这不是一回事。如果这段代码是一个性能瓶颈,我可以告诉你怎么做w使用numpy加快速度。不过,它的可读性要差得多。(老实说,如果你遇到性能问题,它非常适合cython。)感谢你的回答。我稍微修改了我的问题,使其更一般化,即p[I][j]中的I也可以更改。感谢您的回答。我稍微更改了我的问题,使其更为一般化,因此p[I][j]中的I也可以更改。