【问题标题】:Python list doesn't give the rigth resultPython列表没有给出正确的结果
【发布时间】:2024-04-29 05:35:02
【问题描述】:

我正在尝试创建一个包含来自节点的所有路径的列表,但我的列表只包含第一个路径一遍又一遍,即使我编写了一个应该遍历所有节点的范围函数。谁能告诉我哪里出错了?

这是输入:

Nodes:

1   (5,13)  (1,3)  [3] 
2   (15,5)  (2,1)  
3   (8,11)  (2,4)  [1,4,5,6]
4   (11,3)  (3,3)  [1]
5    (3,7)  (2,2)   
6   (20,6)  (1,1)  [2,3,7]
7   (15,8)  (3,4)  [1,2,4]

如您所见,有些节点没有第三索引,这意味着它们可以访问所有路径 [1,2,3,4,5,6,7]

正确的列表应该是这样的:

[[3], [1,2,3,4,5,6,7], [1,4,5,6], [1], [1,2,3,4,5,6,7], [2,3,7], [1,2,4]]

print (all_paths)

给出 [1, 2, 3, 4, 5, 6, 7] 和 print(len(nodes)) 给出 7,它们工作正常,但 print(paths) 给出 [[3] , [3], [3], [3], [3], [3], [3]] 这是错误的。任何帮助将不胜感激。

all_paths = []
for i in range (len(nodes)):
    all_paths.append(i+1)

def index_in_list(nodes):
    for i in range (len(nodes)):
        if (len(nodes[i])) < 3:
            return False
        else:
            return True

paths = []
for i in range (len(nodes)):
           if index_in_list(nodes) is True:
               paths.insert(i,nodes[0][2])
           else:
               paths.insert([all_paths])

我尝试使用循环修复它,但现在我的路径列表保持为空

def index_in_list(nodes):
    paths = []
while i < (len(nodes)):
      if (len(nodes[i])) < 3:
          paths.insert(i,[all_paths]
          i = i + 1
      else:
          paths.insert(i,[all_paths])
          i = i + 1

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。您发布的代码因nodes 未定义而死亡,并且没有明确的执行跟踪来显示结果开始偏离您的预期的位置。
  • 在您提供 MRE 后,我很乐意查看您的更新。不要指望我们编写驱动程序、提供输入示例并纠正您的语法错误。
  • 嗯,我使输入更清晰,根据 python 没有语法错误,我已经阅读了 MRE 应该是什么,我想我做到了。也许我遗漏了一些东西,因为英语不是我的第一语言而且我是初学者,但这是我所有的代码,其中节点作为输入以及应该从中得出的正确列表。
  • 您的最后一个代码部分,即尝试修复,是一个两行函数,后跟一个 while 循环,由于未定义的符号而失败。我怀疑您需要缩进 while 以将所有代码带入函数中。仍然没有 MRE;请再次阅读我的第一条评论。

标签: python list function


【解决方案1】:

我感觉index_in_list 函数的行为与您预期的不同。每当python在函数中遇到return语句时,它将退出该函数并返回与return一起写入的值。在这种情况下,您总是开始查看索引 0 处的 nodes 的长度,然后函数返回 True。因此,在您调用函数的代码中,这将始终为 True,并且您将始终插入 nodes[0][2],即 [3]

【讨论】:

    【解决方案2】:

    我快速扫描了您的代码,看来问题可能出在此处:

           if index_in_list(nodes) is True:
               paths.insert(i,nodes[0][2])
           else:
               paths.insert([all_paths])
    

    index_in_list 立即返回节点[0] 的结果,对于您的数据集,它始终为True;它从不检查其他节点。然后,上面的代码将相同的[3] 索引多次插入paths。您的逻辑移动中的任何内容都不会考虑任何其他节点。

    【讨论】:

    • 那么它怎么也能越过其他节点呢?我尝试在插入后将 1 添加到节点,但它没有工作
    • 你写了一个循环来做你想做的事。任何有关检查列表的教程都会向您展示如何执行此操作。很简单,在检查完所有节点之前,您无法返回失败。您必须将return False 拉出循环。
    • 我更新了一个带循环的函数,但这次什么都不用了,你能看看吗