Python列表索引超出范围

Python列表索引超出范围,python,list,Python,List,我在用Python填充列表时遇到了一些问题。我不断得到一个列表索引超出范围的错误。len(网络)的输出是7,所以我认为从0-6填充它应该可以给我一个7x7列表 def fillNodeTable(): nodeTable = [] for x in xrange(0, (len(network) -1)): for y in xrange(0, (len(network) -1)): nodeTable[x][y].append(Node) print nodeT

我在用Python填充列表时遇到了一些问题。我不断得到一个列表索引超出范围的错误。len(网络)的输出是7,所以我认为从0-6填充它应该可以给我一个7x7列表

def fillNodeTable():
  nodeTable = []
  for x in xrange(0, (len(network) -1)):
    for y in xrange(0, (len(network) -1)):
      nodeTable[x][y].append(Node)
  print nodeTable
所以我就这样结束了,它起作用了

n = len(network)
nodeTable = [[Node]*n for x in xrange(n)]
当我打印要调试的nodeTable时,会得到以下结果:

<class __main__.Node at 0xb737914c>


这仅仅是因为我在每个条目中添加了一个类,还是我在这里做了一些其他错误?

我认为您正在移植一个MATLAB代码。您在nodeTable上遇到超出范围的错误。将其初始化为空数组

尝试以下操作,或使用numpy中的数组类:

> a = []
>>> for i in xrange(3):
...     a.append([])
...     for j in xrange(3):
...             a[i].append(i+j)


我认为您正在移植一个MATLAB代码。您在nodeTable上遇到超出范围的错误。将其初始化为空数组

尝试以下操作,或使用numpy中的数组类:

> a = []
>>> for i in xrange(3):
...     a.append([])
...     for j in xrange(3):
...             a[i].append(i+j)


我认为您可以使用列表理解,因为它更清晰:

nodeTable = [[Node for x in network] for y in network]

我认为您可以使用列表理解,因为它更清晰:

nodeTable = [[Node for x in network] for y in network]

问题是
xrange(0,6)
将为您提供6个项目,从0到5

>>> len(xrange(0,6))
6
>>> len(xrange(0,7))
7

问题是
xrange(0,6)
将为您提供6个项目,从0到5

>>> len(xrange(0,6))
6
>>> len(xrange(0,7))
7

问题在于您定义列表的方式。您已将列表定义为一维列表,并尝试将其用作多维列表。尝试下面的解决方案

代码:

def fillNodeTable():

输出:

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']


['Node']['Node']['Node']['Node']['Node']['Node']['Node']

定义列表的方式是个问题。您已将列表定义为一维列表,并尝试将其用作多维列表。尝试下面的解决方案

代码:

def fillNodeTable():

输出:

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']

['Node']['Node']['Node']['Node']['Node']['Node']['Node']


['Node']['Node']['Node']['Node']['Node']['Node']['Node']

如果我们一步一步地检查您的代码,问题就会变得更清楚:

nodeTable = []
因此,
nodeTable
是一个空列表。 我们开始一个循环,然后立即开始另一个循环-因此,我们进行第一次迭代,其中
x
y
都是0

 nodeTable[x][y].append(Node)
这说明:在
nodeTable
中找到第0项,在其中找到第0项,并在其上调用
append
。这将导致错误,因为
nodeTable
为空-它没有要查找的第0项。所以,解决办法是在我们到达这一点之前给它一个。这将有助于:

for x in xrange(0, (len(network) -1)):
     nodeTable.append([])
     for y in xrange(0, (len(network) -1)):):
         nodeTable[x].append(Node)
但是,还有几件事需要注意:首先,这将为您提供
(len(network)-1)*(len(network)-1)
节点的副本,按嵌套列表排列。如果
Node
是一个如其名称所示的类,这意味着您将获得该类的那么多副本,而不是该类的那么多单独实例。为此,您可以:
.append(Node)

下一件事是,正如其他人所提到的,这可以写成嵌套列表:

[[Node() for y in xrange(0, (len(network -1))] for x in xrange(0, (len(network) -1))]
为了达到完全相同的效果,尽管可能效率更高一些

第三,
xrange
将假定0,如果您没有明确给出它-即

 xrange(len(network) - 1)
相当于您的:

 xrange(0, (len(network) - 1))
最后,
xrange(len(network)-1)
可能不是您想要的。这将使
nodeTable
和其中的每个列表比
network
短一个元素
xrange
stop
值之前停止,而不是在该值处。这意味着您可能需要
[对于xrange中的x(len(网络))]
。但作为一种列表理解,我们不再使用
x
y
,这意味着我们不需要他们特别使用数字:

[[Node() for x in network] for y in network]

,正如@jcollado所建议的,将做同样的事情。

如果我们一步一步地检查您的代码,问题就会变得更清楚:

nodeTable = []
因此,
nodeTable
是一个空列表。 我们开始一个循环,然后立即开始另一个循环-因此,我们进行第一次迭代,其中
x
y
都是0

 nodeTable[x][y].append(Node)
这说明:在
nodeTable
中找到第0项,在其中找到第0项,并在其上调用
append
。这将导致错误,因为
nodeTable
为空-它没有要查找的第0项。所以,解决办法是在我们到达这一点之前给它一个。这将有助于:

for x in xrange(0, (len(network) -1)):
     nodeTable.append([])
     for y in xrange(0, (len(network) -1)):):
         nodeTable[x].append(Node)
但是,还有几件事需要注意:首先,这将为您提供
(len(network)-1)*(len(network)-1)
节点的副本,按嵌套列表排列。如果
Node
是一个如其名称所示的类,这意味着您将获得该类的那么多副本,而不是该类的那么多单独实例。为此,您可以:
.append(Node)

下一件事是,正如其他人所提到的,这可以写成嵌套列表:

[[Node() for y in xrange(0, (len(network -1))] for x in xrange(0, (len(network) -1))]
为了达到完全相同的效果,尽管可能效率更高一些

第三,
xrange
将假定0,如果您没有明确给出它-即

 xrange(len(network) - 1)
相当于您的:

 xrange(0, (len(network) - 1))
最后,
xrange(len(network)-1)
可能不是您想要的。这将使
nodeTable
和其中的每个列表比
network
短一个元素<代码>xrange在<代码>之前停止