如何使用 enumerate() 更改嵌套列表中的值

how to use enumerate() to change a value in a nested list

提问人:Patstro 提问时间:5/15/2023 最后编辑:Michael M.Patstro 更新时间:5/15/2023 访问量:183

问:

我有一个来自 geotiff 文件的 2D 数组。请参阅下面的示例数组:

example_array = [[ 0, 1, 1, 0, 0, 0, 0], 
                 [ 2, 1, 1, 2, 0, 0, 0], 
                 [ 0, 3, 1, 1, 3, 0, 0], 
                 [ 4, 1, 1, 4, 0, 0, 0], 
                 [ 0, 5, 1, 1, 5, 0, 0], 
                 [ 0, 1, 1, 0, 0, 0, 0]]

我正在尝试编写一个程序,将每个嵌套列表中大于 1 的第一个数字更改为“值 + 100”。

在其他人的帮助下,请参阅以下工作代码片段:

for i, sub_list in enumerate(example_array[1:], start= 1):
 for j, entry in enumerate(sub_list[1:][1:1], start = 1):
        if entry > 1 and j != 1 and j != len(sub_list):
            example_array[i][j] += 100
print(example_array)

上面的代码生成了以下不正确的示例数组,其中没有任何值发生更改:

incorrect_example_array = [[ 0, 1, 1, 0, 0, 0, 0], 
                           [ 2, 1, 1, 2, 0, 0, 0], 
                           [ 0, 3, 1, 1, 3, 0, 0], 
                           [ 4, 1, 1, 4, 0, 0, 0], 
                           [ 0, 5, 1, 1, 5, 0, 0], 
                           [ 0, 1, 1, 0, 0, 0, 0]]

我想创建以下正确的示例数组

correct_example_array = [[  0,  1,  1, 0, 0, 0, 0], 
                         [ 102, 1,  1, 2, 0, 0, 0], 
                         [  0, 103, 1, 1, 3, 0, 0], 
                         [ 104, 1,  1, 4, 0, 0, 0], 
                         [  0, 105, 1, 1, 5, 0, 0], 
                         [  0,  1,  1, 0, 0, 0, 0]]
Python 数组 枚举

评论

0赞 John Gordon 5/15/2023
for j, entry in enumerate(sub_list[1:][1:1], start = 1)你为什么要使用一片?该切片保证为空。所以第二个循环永远不会执行,因此最里面的代码显然也永远不会执行......[1:1]for

答:

0赞 Unmitigated 5/15/2023 #1

外循环不需要索引; 是不需要的。找到匹配项后,您可以立即中断内部循环。也无需对内部索引执行任何检查。enumerate

for l in example_array:
    for i, x in enumerate(l):
        if x > 1:
            l[i] += 100
            break

评论

0赞 Patstro 5/15/2023
非常感谢!如果我也想操作列表中的最后一个值,您有什么建议吗?我可以从 [-1] 开始 for 循环吗?
0赞 Unmitigated 5/15/2023
@Patstro 只需将其更改为for i, x in reversed([*enumerate(l)])
0赞 Patstro 5/15/2023
谢谢!最后一个问题:有没有办法指定一个特定的列表来独占地运行 for 循环?如果我假设只想更改数组中最后一个列表中大于 1 的第一个数字。或者你有没有用过的资源来为你提供教育,让你自己解决这个问题?
0赞 Unmitigated 5/15/2023
@Patstro 那么你只需要一个循环。拆下外环并使用和for i, x in enumerate(example_array[-1]):example_array[-1][i] += 100
0赞 Patstro 5/16/2023
如果有理由操作数组中的其他值,比如说,如果我们想更改大于 1 的第二个数字,而不是第一个大于 1 的数字,我可以在 if x > 1: 中添加一个参数,然后相对于初始代码找到的第一个大于 1 的值在数组中移动?