在python中实现具有标签的图形

时间:2013-07-17 17:08:16

标签: python graph-theory

受此链接中https://www.python.org/doc/essays/graphs/信息的启发,我一直在实施图结构。我一般都用

graph = {'A': ['B', 'C'],
             'B': ['C', 'D'],
             'C': ['D'],
             'D': ['C']}

edges = [('A','B',20),('A','C',40), ('B','C',10), ('B','D',15),('C','D',10),('D','C',10)]

这两个是我在C中最接近对象表示的。但有时我必须存储有关图标签的更多信息。例如,图形节点是一个国家/地区内的状态,因此我必须存储全名(california)和缩写(CA)以及每个节点。 什么是最好的方法。我知道字典值可以是类实例,但不是字典键。所以我只想创建一个单独的字典,其中图形节点“A”作为键,类实例“StateDetails”作为包含状态和abbreivation的值。例如

state_map = {'A': StateDetails('California','CA') ..    }  

如果有人告诉我一个更有效的方法来解决这个问题,特别是在python中使用图表,我将不胜感激

3 个答案:

答案 0 :(得分:0)

只需在图表外存储额外信息即可。例如。保持一个字典

full_name = {"CA": California,
             # 49 more entries
            }

然后使用"CA"作为图节点。

这使得图算法必须更容易实现,因为您不必解决节点拖动的额外信息,这使得它们可维护,因为您存储的信息可能会更改,并且它也可能会他们更快。

(事实上,对于真实世界的应用程序,我只使用整数索引作为图形节点,并将所有额外信息存储在一个单独的结构中。这样,您可以使用NumPy和SciPy来完成繁重的工作。 )

答案 1 :(得分:0)

如何以标准JSON格式存储数据?

state_map = { "A": { "state_name": "California", "state_code": "CA" } }

要查找A的州名,现在只需输入

即可
state_map['A']['state_name'] # California

答案 2 :(得分:0)

如果您实施__eq____hash__,则可以将您的班级用作dict密钥,例如:

class StateDetails(object):
    def __init__(self, state, abbrev):
        self.state = state
        self.abbrev = abbrev
    def __eq__(self, other):
        return isinstance(other, self.__class__) and self.abbrev == other.abbrev
    def __hash__(self):
        return hash(self.abbrev)
    def __repr__(self):
        return '{}({!r}, {!r})'.format(self.__class__.__name__, self.state, self.abbrev)

CA = StateDetails('California', 'CA')
AZ = StateDetails('Arizona', 'AZ')
NV = StateDetails('Nevada', 'NV')
UT = StateDetails('Utah', 'UT')
graph = {CA: [AZ, NV],
         AZ: [CA, NV, UT],
         NV: [CA, AZ, UT],
         UT: [AZ, NV]}

结果:

>>> pprint.pprint(graph)
{StateDetails('California', 'CA'): [StateDetails('Arizona', 'AZ'),
                                    StateDetails('Nevada', 'NV')],
 StateDetails('Arizona', 'AZ'): [StateDetails('California', 'CA'),
                                 StateDetails('Nevada', 'NV'),
                                 StateDetails('Utah', 'UT')],
 StateDetails('Nevada', 'NV'): [StateDetails('California', 'CA'),
                                StateDetails('Arizona', 'AZ'),
                                StateDetails('Utah', 'UT')],
 StateDetails('Utah', 'UT'): [StateDetails('Arizona', 'AZ'),
                              StateDetails('Nevada', 'NV')]}