类和数组问题

时间:2012-02-02 23:52:44

标签: python

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

1 个答案:

答案 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()) 个实例的列表,您将获得列表列表。