提问人:Patstro 提问时间:5/15/2023 最后编辑:Michael M.Patstro 更新时间:5/15/2023 访问量:183
如何使用 enumerate() 更改嵌套列表中的值
how to use enumerate() to change a value in a nested list
问:
我有一个来自 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]]
答:
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 的值在数组中移动?
下一个:如何更改字符串中的前两个单词?
评论
for j, entry in enumerate(sub_list[1:][1:1], start = 1)
你为什么要使用一片?该切片保证为空。所以第二个循环永远不会执行,因此最里面的代码显然也永远不会执行......[1:1]
for