为什么这个循环从来没有通过列表中的第一项?

2024-10-05 13:25:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它应该将矩阵奇数行中的每个元素增加5,偶数行中的每个元素增加10。我写了下面的代码:

def incrementRows(matrix):
    for i in matrix:
        print(matrix.index(i))

        if matrix.index(i) % 2 == 0:
            matrix[matrix.index(i)] = [x + 5 for x in matrix[matrix.index(i)]]
        else:
            matrix[matrix.index(i)] = [x + 10 for x in matrix[matrix.index(i)]]


    return matrix


matrix = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]

print(incrementRows(matrix))

这个代码的问题是,从印刷品来看(矩阵索引(i) )语句,循环从不传递列表中的第一项。我不明白为什么。以下是输出:

0
0
0
[[16, 17, 18, 19, 20], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

如果我从函数中取出If/else语句,那么循环将正确地遍历列表中的每个项。你知道吗

def incrementRows(matrix):
    for i in matrix:
        print(matrix.index(i))

    return matrix


matrix = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]

print(incrementRows(matrix))

结果:

0
1
2
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

有人能告诉我为什么函数中的If/else语句阻止循环遍历列表中的每一项吗?你知道吗


Tags: 函数代码in元素列表forindexreturn
3条回答

问题是在第二次迭代中,第一项和第二项比较相等,所以index只会再次给出第一项。你知道吗

我相信是时候让你了解enumerate()。基本上这里i只是索引,而不必反复扫描列表中的匹配项。你知道吗

def incrementRows(matrix):
    for i, item in enumerate(matrix):
        print(i)

        if i % 2 == 0:
            matrix[i] = [x + 5 for x in item]
        else:
            matrix[i] = [x + 10 for x in item]


    return matrix


matrix = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]

print(incrementRows(matrix))

代码更容易阅读,现在可以正常工作了

这里更直接的方法是使用list comp,并根据在条件表达式中迭代的“行号”来选择加5或10,例如:

matrix = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
result = [
    [n + 5 if rowno % 2 == 0 else n + 10 for n in row] 
    for rowno, row in enumerate(matrix)
]
# [[6, 7, 8, 9, 10], [16, 17, 18, 19, 20], [16, 17, 18, 19, 20]]

对于给定的数据,您将在每个步骤更改矩阵,以确保在索引0处始终可以找到矩阵中的下一项。你知道吗

检查一下,换一下

print(matrix.index(i))

print(i, matrix, matrix.index(i))

你会看到更多的信息输出:

[1, 2, 3, 4, 5] [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 0
[6, 7, 8, 9, 10] [[6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 0
[11, 12, 13, 14, 15] [[11, 12, 13, 14, 15], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 0

看到了吗?每次都要更改第0个索引,使其等于矩阵中的下一项。你知道吗

循环一个列表中的项目,然后对列表中的每个项目进行.index,当然,总是会首先找到每个项目副本的出现点——除了在任何情况下浪费大量的计算(循环O(N平方),当然应该是O(N))之外,在像你这样的情况下,这会引起真正奇怪的结果。你知道吗

要恢复理智,请更改部件:

def incrementRows(matrix):
    for i in matrix:
        print(matrix.index(i))

到,例如

def incrementRows(matrix):
    for where in range(len(matrix)):
        print(where)

在剩下的时间里使用where,无论你现在在哪里重新计算(浪费了荒谬的循环数)matrix.index(i)。你知道吗

相关问题 更多 >

    热门问题