python 我不明白我的元组索引怎么会超出get_node_attributes和networkx的范围

bnl4lu3b  于 2023-03-11  发布在  Python
关注(0)|答案(1)|浏览(58)

我正在努力让下面的代码工作。我的目标是,在指定特定位置的节点/边后,计算它们之间的距离。当我硬编码值0和1时,我收到预期的答案,但当我尝试使用while循环迭代时,我得到下面的错误输出(编辑以添加完整的错误消息):

C:\Users\Owner\Desktop\Math Thinking in CS\Python code>py hamilt.py
86.6083136886985
Traceback (most recent call last):
  File "C:\Users\Owner\Desktop\Math Thinking in CS\Python code\hamilt.py", line 77, in <module>
    print(cycle_length(g,cycle3))
          ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Owner\Desktop\Math Thinking in CS\Python code\hamilt.py", line 27, in cycle_length
    dist = np.sqrt(((pos[d+1][d]-pos[d][d]))**2 + (pos[d][d+1]-pos[d+1][d+1])**2)
                                                   ~~~~~~^^^^^
IndexError: tuple index out of range

特别注意--我没有使用“for _ in [:-1]:“形式的for循环,因为出于某种原因,我使用的coursera评分器称其超出范围,即使它在我的机器上成功运行。此外,我正在学习的课程的讨论论坛非常活跃,所以我转向其他地方寻求帮助。由于这是一门课程,请随时为我指出方向,而不是回答/直接给出代码解决方案,如果这更有指导意义的话。

import networkx as nx
import numpy as np

def cycle_length(g, cycle):
    assert len(cycle) == g.number_of_nodes()
    cycleweight = 0
    vertices = 0
    pos=nx.get_node_attributes(g,'pos')

    dist=range(0,len(cycle))
    d = 0
    while d < len(cycle) - 1:
        dist = np.sqrt(((pos[d+1][d]-pos[d][d]))**2 + (pos[d][d+1]-pos[d+1][d+1])**2) #this is the line giving me issues
        print(dist)
        d += 1
    
    while vertices < len(cycle) - 1:
        cycleweight = cycleweight + g[cycle[vertices]][cycle[vertices+1]]['weight']*dist[vertices]
        vertices += 1
    return cycleweight
    
g = nx.Graph()

g.add_node(0,pos=(174,25))
g.add_node(1,pos=(129,99))
g.add_node(2,pos=(268,212))
g.add_node(3,pos=(211,209))
g.add_node(4,pos=(156,82))

g.add_edge(4,1,weight=1)
g.add_edge(1,0,weight=1)
g.add_edge(0,3,weight=1)
g.add_edge(3,2,weight=1)
g.add_edge(2,4,weight=1)

cycle3 = [4,1,0,3,2]

print(cycle_length(g,cycle3))

我试过输入硬编码的值,这很有效,但是当我试着输入一个我正在迭代的变量时,我无法让它工作。

sshcrbum

sshcrbum1#

此处:

d = 0
    while d < len(cycle) - 1:
        dist = np.sqrt(((pos[d + 1][d] - pos[d][d])) ** 2 + (
                    pos[d][d + 1] - pos[d + 1][d + 1]) ** 2)
        print(dist)
        d += 1

d0开始,然后继续while d < len(cycle) - 1,每次迭代d加1,在示例中,len(cycle)等于5,因此d0变为3
在第二次迭代中,d等于1,如果pos的值为{0: (174, 25), 1: (129, 99), 2: (268, 212), 3: (211, 209), 4: (156, 82)},你认为在计算pos[d][d + 1]时会发生什么?
pos[x][y]的第二个索引y应该总是01,如果你用它来访问2元组字典的话。

相关问题