如何从基于另一个键值对的列表中的字典访问值?

时间:2019-09-26 00:04:16

标签: python list dictionary

给出下面的列表,

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'] 

3 个答案:

答案 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']