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