1

受此链接中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 中最接近对象表示的方法。但有时我必须存储有关图形标签的更多信息。例如,图形节点是一个国家/地区的州,因此我必须将全名(加利福尼亚)和缩写(CA)与每个节点一起存储。最好的方法是什么。我知道字典值可以是类实例,但不是字典键。所以我只是想创建一个单独的字典,其中图形节点“A”作为键,类实例“StateDetails”作为包含状态和缩写的值。例如

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

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

4

3 回答 3

0

以标准 JSON 格式存储数据怎么样?

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

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

state_map['A']['state_name'] # California
于 2013-07-17T17:19:25.077 回答
0

__eq__如果您实现and ,您可以将您的类用作 dict 键__hash__,例如:

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')]}
于 2013-07-17T17:20:08.123 回答
0

只需将额外信息存储在图表之外。例如保留一个字典

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

然后"CA"用作图形节点。

这使得图算法必须更容易实现,因为您不必处理节点拖动的额外信息,它使它们可维护,因为您存储的信息可能会发生变化,并且还可能使它们更快。

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

于 2013-07-17T17:15:35.463 回答