2016-04-20 167 views
0

我有一个国家公路规划网络数据库中的节点和边缘对象的列表。很多数据都是从我隐瞒,但是这是在给我:蟒蛇 - 从节点和边缘列表建立邻接列表

class Node: 
    def __init__(self, longitude, latitude, state, description): 
     self.longitude = longitude 
     self.latitude = latitude 
     self.state = state 
     self.description = description 

class Link: 
    """A bi-directional edge linking two NHPN nodes.""" 

    def __init__ (self, begin, end, description): 
     """create a link given its beginning and end (which must be nodes) 
     and possibly a description string.""" 
     self.begin = begin 
     self.end = end 
     self.description = description 

我知道有没有给大量的信息,但我试图建立从这个数据邻接表。我非常想用字典。这是我试过的:

for node in nodes: 
    adj[node] = None 
for edge in edges: 
    adj[node] = (edge.begin, edge.end) #edge.begin and edge.end being node's neighbors 

后跟一个打印语句,只是为了看看它是否工作。但它从来没有打印过,它担心输入是巨大的,我的代码会非常慢。我如何修改我的实现?我非常想使用字典,但我愿意接受所有建议。

+0

您是否必须使用这些类定义?字典需要可哈希键,而且这些类都不可哈希。 –

+0

@Robᵩ如果你指的是节点和链接,很可能是因为我无法想象有任何其他方式来遍历节点和边缘。如果你的意思是经度/纬度/等,并开始/结束,可能不会,但我想不出一种方式来做到这一点,没有开始/结束 –

+0

NHPN数据库似乎是相当大的。我认为来自@Robᵩ的问题旨在发现如果可以对数据存储格式进行任何更改。你已经在记忆中拥有所有这些记录了吗?你是否在使用其他人的解析器来处理XML文件?另外,邻接列表的用例是什么?插入数据库?建立地图?解决旅行商问题? –

回答

2

这是一个程序,计算一小部分高速公路的邻接表。我尽可能多地使用了您的问题中的代码。

from pprint import pprint 
class Node: 
    def __init__(self, longitude, latitude, state, description): 
     self._longitude = longitude 
     self._latitude = latitude 
     self.state = state 
     self.description = description 

    @property 
    def longitude(self): 
     return self._longitude 
    @property 
    def latitude(self): 
     return self._latitude 

    def __hash__(self): 
     return hash((self.longitude, self.latitude)) 

    def __repr__(self): 
     return 'Node({_longitude!r}, {_latitude!r}, {state!r}, {description!r})'.format(**vars(self)) 

class Link: 
    """A bi-directional edge linking two NHPN nodes.""" 

    def __init__ (self, begin, end, description): 
     """create a link given its beginning and end (which must be nodes) 
     and possibly a description string.""" 
     self.begin = begin 
     self.end = end 
     self.description = description 

chicago = Node(-87, 41, 'IL', 'Windy City') 
bloomington = Node(-89, 40, 'IL', 'Twin City') 
indy = Node(-86, 40, 'IN', 'Naptown') 
nodes = [ chicago, bloomington, indy ] 
edges = [ 
    Link(chicago, bloomington, 'I-55'), 
    Link(chicago, indy, 'I-65'), 
    Link(indy, bloomington, 'I-74'), 
] 

adj = {} 
for edge in edges: 
    adj.setdefault(edge.begin, set()).add(edge.end) 
    adj.setdefault(edge.end, set()).add(edge.begin) 
pprint(adj) 

这是它会是什么样子,如果我们没有使用LinkNode为提供:

from pprint import pprint 
from collections import namedtuple 

Node = namedtuple('Node', 'longitude latitude state description') 
Link = namedtuple('Link', 'begin end description') 

chicago = Node(-87, 41, 'IL', 'Windy City') 
bloomington = Node(-89, 40, 'IL', 'Twin City') 
indy = Node(-86, 40, 'IN', 'Naptown') 
nodes = [ chicago, bloomington, indy ] 
edges = [ 
    Link(chicago, bloomington, 'I-55'), 
    Link(chicago, indy, 'I-65'), 
    Link(indy, bloomington, 'I-74'), 
] 

adj = {} 
for edge in edges: 
    adj.setdefault(edge.begin, set()).add(edge.end) 
    adj.setdefault(edge.end, set()).add(edge.begin) 
pprint(adj) 

这里是一个不使用任何类定义都:

from pprint import pprint 

chicago = (-87, 41, 'IL', 'Windy City') 
bloomington = (-89, 40, 'IL', 'Twin City') 
indy = (-86, 40, 'IN', 'Naptown') 
nodes = [ chicago, bloomington, indy ] 
edges = [ 
    (chicago, bloomington, 'I-55'), 
    (chicago, indy, 'I-65'), 
    (indy, bloomington, 'I-74'), 
] 

adj = {} 
for edge in edges: 
    adj.setdefault(edge[0], set()).add(edge[1]) 
    adj.setdefault(edge[1], set()).add(edge[0]) 
pprint(adj)