给出下面的列表,
graph = [{'Node':'A', 'children':['T','Z','S'], 'gWt':[118,75,140], 'h':366},
{'Node':'Z', 'children':['O','A'], 'gWt':[71,75], 'h':374},
{'Node':'T', 'children':['A'], 'gWt':[118], 'h':329},
{'Node':'S', 'children':['A','O','R','F'], 'gWt':[140,151,80,99], 'h':253}]
对于给定的节点值,我将如何获得其所有“子级”? 例如,
graph.index('Node'=='S')['children'] -> ['A','O','R','F']
答案 0 :(得分:2)
index()
或next()
的评论:创建节点名称列表,然后使用index()
查找节点索引是解决方法,但是请注意,这可能会导致性能严重下降以及逻辑错误。
list.index(target)
在列表中查找是 O(n),这意味着它将遍历列表中的每个元素,直到找到第一个 >与目标不匹配的元素。graph = [{"node": "A", ...props1}, {"node": "A", ... props2}]
,由于{{ 1}}函数。如果要查找每个节点index()
,则需要在所有列表上运行"A"
,直到确定已找到所有节点index()
,然后再考虑合并策略节点属性。使用字典存储图的节点。由于字典为hash tables,因此它们具有恒定的时间查询( O(1))。您要实现的表示形式是:
"A"
这也将使图形遍历变得非常容易。这样,每当您在寻找节点graph = {
"A": {'children':['T','Z','S'], 'gWt':[118,75,140], 'h':366},
"B": {'children':['O','A'], 'gWt':[71,75], 'h':374},
...
}
时,您只需要"X"
来获取它,而graph["X"]
来获取它的子节点即可。
如果您不能构造上述数据结构,那么如果您打算不断查询图的节点属性,则必须将其转换为最佳结构。您可以通过以下方式实现:
graph["X"]["children"]
调用函数def transform_graph(graph):
new_graph = {}
for node in graph:
node_name = node['Node']
new_graph[node_name] = new_graph.get(
node_name,
{'children': set(), 'gWt': set(), 'h': 0}
)
new_graph[node_name]["children"] |= set(node['children'])
new_graph[node_name]["gWt"] |= set(node["gWt"])
new_graph[node_name]["h"] = node["h"]
return new_graph
的输出是
transform_graph(old_graph)
答案 1 :(得分:1)
假设只有一个值等于'S'
,则可以使用next:
graph = [{'Node':'A', 'children':['T','Z','S'], 'gWt':[118,75,140], 'h':366},
{'Node':'Z', 'children':['O','A'], 'gWt':[71,75], 'h':374},
{'Node':'T', 'children':['A'], 'gWt':[118], 'h':329},
{'Node':'S', 'children':['A','O','R','F'], 'gWt':[140,151,80,99], 'h':253}]
result = next(e for e in graph if e['Node'] == 'S')['children']
print(result)
输出
['A', 'O', 'R', 'F']
答案 2 :(得分:0)
我很喜欢您的数据,它的格式可能是最好的,但这确实可以做到:
graph[[x['Node'] for x in graph].index('S')]['children']
将打印
['A', 'O', 'R', 'F']