使用 for 循环和枚举来操作嵌套列表中的值

Using for loops and enumerate to manipulate values within nested lists

提问人:Patstro 提问时间:4/18/2023 最后编辑:Patstro 更新时间:4/19/2023 访问量:118

问:

如果这篇文章中有不正确的术语,我深表歉意,我对 python 比较陌生,并且正在尝试一些东西。

我正在尝试构建一个程序,该程序将为嵌套列表中的值添加值。

请参阅下面的嵌套列表。

List = [ nan, 4, 5, nan, nan, nan, nan], 
       [ nan, 4, 2,  3,   5,  nan, nan], 
       [ nan, 4, 2,  3,   5,  nan, nan], 
       [ nan, 4, 2,  3,   5,  nan, nan], 
       [ nan, 4, 2,  3,   5,  nan, nan], 
       [ nan, 4, 5, nan, nan, nan, nan]

我希望程序从第二个列表开始,在序列中的最终列表之前结束,并跳过列表二到列表五个中的第一个和最后一个值。本质上只是为 2 和 3 所在的地方添加值。

解决方案应如下所示:

List = [ nan, 4, 5, nan, nan, nan, nan], 
       [ nan, 4, 3,  4,   5,  nan, nan], 
       [ nan, 4, 3,  4,   5,  nan, nan], 
       [ nan, 4, 3,  4,   5,  nan, nan], 
       [ nan, 4, 3,  4,   5,  nan, nan], 
       [ nan, 4, 5, nan, nan, nan, nan]

我试图按如下方式解决这个问题:首先,创建一个程序将在其中迭代的“for”循环范围边界条件,由于列表从 0 开始,到 -1 结束,我可以添加一个范围 (1,-2),然后从列表中排除第一个和最后一个嵌套列表。接下来是一个嵌套的“for”循环,它将使用 enumerate 迭代我感兴趣的单个嵌套列表范围内的值,即 2 和 3 点。

for index in range (1,-1):
   for index, item in enumerate(List, start = 1):     
      if item > 1:
         List[index] = round((List[index]+1),3)
print(List)

枚举函数有一个启动函数,如果我将“if”语句设置为大于 1,它将跳过 nan 值并从 2 开始。我不确定如何让程序在 5 之前停止。现在程序正在运行,但没有任何数字改变。

任何帮助将不胜感激。

谢谢。

编辑: 我在下面更新了我的example_list和代码:

example_list = [[ 0, 4, 5, 0, 0, 0, 0], 
[ 0, 4, 2,  3,   5,  0, 0], 
[ 0, 4, 2,  3,   5,  0, 0], 
[ 0, 4, 2,  3,   5,  0, 0], 
[ 0, 4, 2,  3,   5,  0, 0], 
[ 0, 4, 5, 0, 0, 0, 0]]

x = 1

for i, sub_list in enumerate(example_list[1:-1],start=1):
    for j, entry in enumerate(sub_list[1:-1][1:-1], start=2):
           if j > 1:
               example_list[j] = round((example_list[j]+    x),3)
           example_list[i][j] += 1
print(example_list)

我遇到了 TypeError:只能将列表(而不是“int”)连接到列表错误。

python-3.x 嵌套循环嵌 套列表

评论


答:

0赞 Jan Wilamowski 4/18/2023 #1

您的方法和当前代码都存在几个问题:

  1. 定义输入的方式的语法无效,将抛出 .如果你想要一个嵌套列表,你必须嵌套方括号,例如:IndentationError
inputs = [
    [1, 2, 3],
    [4, 5, 6]
]
  1. nan在Python中不存在,你的意思是?numpy.nan

  2. range(1, -1)可能不会按照你的想法去做。尝试打印出索引等中间值,以了解代码的作用。此外,尝试从尽可能小的输入数据开始,使其更易于理解。

  3. 为变量提供描述性名称以减少混淆。特别是,不要使用它们的类型作为它们的名称(如 )。如果它真的是一个抽象的数字列表,你可以称它为,尽管更有意义的东西会更好。Listnumbers

0赞 ahuma 4/18/2023 #2

正如已经指出的那样,您的问题并不完全正确,但这里有一些关于如何解决问题的想法:

如果您有一个嵌套列表,则为

example_list = [[ nan, 4, 5, nan, nan, nan, nan], 
   [ nan, 4, 2,  3,   5,  nan, nan], 
   [ nan, 4, 2,  3,   5,  nan, nan], 
   [ nan, 4, 2,  3,   5,  nan, nan], 
   [ nan, 4, 2,  3,   5,  nan, nan], 
   [ nan, 4, 5, nan, nan, nan, nan]
]

然后,您可以使用以下代码片段来执行以下操作

从序列中的第二个列表开始,到最后一个列表之前结束,还可以跳过列表二到列表五个中的第一个和最后一个值

for i, sub_list in enumerate(example_list[1:-1],start=1):
    for j, entry in enumerate(sub_list[1:-1],start=1):
        # Perform an operation with that value, e.g. add 1
        example_list[i][j] += 1

本质上只是为 2 和 3 所在的地方添加值。

关于列表中的 2 和 3,它们仅在第 2 列和第 3 列中,因此您可以使用以下代码片段:

for i, sub_list in enumerate(example_list[1:-1], start=1):
    for j, entry in enumerate(sub_list[2:4], start=2):
        # Perform an operation with that value, e.g. add 1
        example_list[i][j] += 1

我希望这会有所帮助!

评论

0赞 Patstro 4/19/2023
对于对我的问题的解释不佳,我深表歉意。我正在尝试添加我的代码部分,在 [j] for 循环下执行操作。如果 J > 1,则添加此代码部分Additional_Value = 1:example_list[j] = round((example_list[j]+ Additional_Value),3)。我收到一个 TypeError:只能将列表(而不是“int”)连接到列表。我以前从未见过。这是您过去遇到过的事情,并且愿意帮助我导航吗?感谢您抽出宝贵时间接受采访。
0赞 ahuma 4/19/2023
在注释中阅读代码真的很难。也许您可以编辑您的原始问题并发布您遇到问题的确切示例脚本,以便它更易于阅读,并且其他人可以尝试在他们的本地计算机上运行您的代码片段。如果你有一个嵌套列表,就像我的代码片段一样,那么问题是 List[index] 本身就是一个列表。您需要使用 List[index1][index2] 访问它,才能在子列表 index1 中的 index2 处获得条目。