受此链接中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中使用图表,我将不胜感激
答案 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')]}