2013-04-15 49 views
0

我正在读取具有代表图形及其邻接表的数字的文件。第一个数字是顶点,其余的是邻居。如何从python中的文件读取图形以获取其邻接列表?

假设如果我有存储在字符串空间分隔的数字串:1 2 3 4

我如何拆分它使得x = 1且y是一个列表[2,3,4]?

  y=[] 
     g=open('graph','r') 
     for line in g: 
      x,y=line.split() 
+0

试第一邻接表到第一行拆分成一个变量,然后分配x和y,也许使用切片。 – rocksportrocker

回答

3

在Python 3,你可以这样做:

x, *y = line.split() 

但在Python 2,你需要拆分至一个可变第一,然后分配给xy

values = line.split() 
x, y = values[0], values[1:] 

如果这些需要是整数而不是字符串,则需要映射值到int()第一:

x, *y = map(int, line.split()) 

或,Python 2中再次:

values = map(int, line.split()) 
x, y = values[0], values[1:] 

Python 3的演示:

>>> x, *y = '1 2 3 4'.split() 
>>> x, y 
('1', ['2', '3', '4']) 
>>> x, *y = map(int, '1 2 3 4'.split()) 
>>> x, y 
(1, [2, 3, 4]) 

的Python 2:

>>> values = '1 2 3 4'.split() 
>>> x, y = values[0], values[1:] 
>>> x, y 
('1', ['2', '3', '4']) 
>>> values = map(int, '1 2 3 4'.split()) 
>>> x, y = values[0], values[1:] 
>>> x, y 
(1, [2, 3, 4]) 
0

下面是一个使用溶液Namedtuple [1]将数据存储在o中面向对象的方式。

Namedtuple是一个创建小类以存储数据的生成器。生成的类可以自己打印,这对调试很好。然而,这些对象是不可变的,要改变任何你必须创建新对象的东西。

from collections import namedtuple 

VertexInfo = namedtuple("VertexInfo", "vert, adj") 

graph = [] 
g = open('graph','r') 
for line in g: 
    nums = line.split() 
    info = VertexInfo(vert=nums[0], adj=nums[1:]) 
    graph.append(info) 

你可以得到的第一个顶点数量:

graph[0].vert 

而且随着

graph[0].adj 

[1] http://docs.python.org/2/library/collections.html#collections.namedtuple