gpt4 book ai didi

python - 类和数组问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:24:44 24 4
gpt4 key购买 nike

我对 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 数组中的每个节点?

最佳答案

冗余线

Python 中的字符串不可变,因此具有以下行:

line.strip(' \n' '\r') 

您只得到了 line 字符串的一个副本,去掉了一些字符,但您没有将它分配给任何东西。改成:

line = line.strip(' \n' '\r') 

正如 DSM 在评论中指出的那样,它不会有太大变化,因为 int 只会忽略多余的空格。

将字符串映射到int

您还像这样将字符串映射到 int:

line = [int(num) for num in line]

可以用 clearer 代替:

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(',')))

如何为每个实例增加Nodeindex属性

可以这样做:

>>> 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 附加到类的实例。我建议您应该将每个特定于实例的变量附加到实例,如上例所示。

节点作为列表添加到列表中

将它作为列表插入另一个列表的最简单方法之一是添加一个将它作为列表返回的方法(参见 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())

但请记住 - 完成上述操作后,您不会获得 Node 实例的列表,您将获得列表的列表。

关于python - 类和数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com