【问题标题】:python - build adjacency list from list of nodes and edgespython - 从节点和边列表构建邻接列表
【发布时间】:2016-04-20 01:32:29
【问题描述】:

我有一个来自国家公路规划网络数据库的节点和边对象列表。很多数据对我来说是隐藏的,但这是给我的:

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

后跟一个打印语句,看看它是否有效。但它从未打印出来,这担心输入量很大,我的代码会非常慢。如何修改我的实施?我非常想使用字典,但我愿意接受所有建议。

【问题讨论】:

  • 你必须使用那些类定义吗?字典需要可散列的键,而这些类都不是可散列的。
  • @Robᵩ 如果您指的是节点和链接,是的,很可能是因为我无法想象还有其他方法可以遍历节点和边。如果您的意思是经度/纬度/等和开始/结束,可能不是,但我想不出没有开始/结束的方法
  • NHPN 数据库似乎相当大。我认为@Robᵩ 的问题旨在发现是否可以对数据存储格式进行任何更改。您是否已经将所有这些记录保存在内存中?您是否使用其他人的解析器来解析 XML 文件?另外,邻接列表的预期用例是什么?插入数据库?建地图?解决旅行商问题?
  • @AustinHastings dijskstra 的算法,用于找到从我周围某个区域到远离我的某个区域(例如圣地亚哥)的最短路径

标签: python dijkstra adjacency-list


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2016-10-15
    相关资源
    最近更新 更多