我对python毫无用处,我正在努力做一些看似简单的事情。 我需要读取一个文本文件,其中包含一个网络路由表,其中包含网络上每个节点之间的距离(下图)
0,2,4,1,6,0,0
2,0,0,0,5,0,0
4,0,0,0,0,5,0
1,0,0,0,1,1,0
6,5,0,1,0,5,5
0,0,5,1,5,0,0
0,0,0,0,5,0,0
然后我需要将它分配给一个二维数组,我已经使用下面编写的代码完成了它。
Network = []
NodeTable = []
def readNetwork():
myFile = open('network.txt','r')
for line in myFile.readlines():
line.strip(' \n' '\r')
line = line.split(',')
line = [int(num) for num in line]
Network.append(line)
一旦完成,我需要迭代网络数组并将每条水平线添加到另一个数组,该数组将保存有关节点的信息,但据我所知,这就是:
class Node(object):
index = #Needs to start from A and increase with each node
previousNode = invalid_node
distFromSource = infinity
visited = False
NodeTable.append(Node())
这样该数组将被初始化为:
A invalid_node infinity False
B invalid_node infinity False
C invalid_node infinity False
...
etc
任何人都可以帮我在NodeTable数组中创建每个节点吗?
答案 0 :(得分:4)
Python中的字符串是不可变的,因此使用以下行:
line.strip(' \n' '\r')
你只获得了line
字符串的副本,删除了一些字符,但是你没有把它分配给任何东西。将其更改为:
line = line.strip(' \n' '\r')
正如DSM在评论中指出的那样,它不会有太大变化,因为int
只会忽略冗余的空格。
int
s 您还将字符串映射到int
,如下所示:
line = [int(num) for num in line]
可以由更清楚的人取代:
line = map(int, line)
并且应该会给你一些轻微的性能提升。要缩短代码,您还可以替换以下行:
line.strip(' \n' '\r')
line = line.split(',')
line = [int(num) for num in line]
Network.append(line)
以下内容:
Network.append(map(int, line.split(',')))
Node
的{{1}}属性这可以这样做:
index
正如您所看到的,>>> class Node(object):
baseindex = '@' # sign before "A"
def __init__(self):
cls = self.__class__
cls.baseindex = chr(ord(cls.baseindex) + 1)
self.index = self.baseindex
self.previousNode = 'invalid_node'
self.distFromSource = 'infinity'
self.visited = False
>>> a = Node()
>>> a.index
'A'
>>> b = Node()
>>> b.index
'B'
>>> a.index
'A'
已附加到班级,baseindex
附加到班级的实例。我建议你应该将每个特定于实例的变量附加到实例,如上例所示。
index
作为列表将其作为列表插入另一个列表的最简单方法之一是添加一个将其作为列表返回的方法(参见Node
方法):
as_list()
所以你应该可以像这样添加节点:
>>> class Node(object):
baseindex = '@' # sign before "A"
def __init__(self):
cls = self.__class__
cls.baseindex = chr(ord(cls.baseindex) + 1)
self.index = self.baseindex
self.previousNode = 'invalid_node'
self.distFromSource = 'infinity'
self.visited = False
def as_list(self):
return [self.index, self.previousNode, self.distFromSource,
self.visited]
>>> a = Node()
>>> a.index
'A'
>>> a.as_list()
['A', 'invalid_node', 'infinity', False]
但请记住 - 完成上述操作后,您将无法获得NodeTable.append(Node().as_list())
个实例的列表,您将获得列表列表。