python - 如何从基于另一个键值对的列表中的字典中访问值?
问题描述
鉴于下面的列表,
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']
解决方案
index()
使用or的评论next()
:
创建节点名称列表,然后使用 查找节点的索引是可行index()
的方法,但请注意,这可能会导致性能大幅下降以及逻辑错误。
- 性能问题:使用
list.index(target)
is O(n)在列表中查找,这意味着它遍历列表中的每个元素,直到找到与不理想的目标匹配的第一个元素。 - 逻辑错误:如果你有一个格式错误的图,一个包含两次或更多相同节点名称的列表,例如: ,由于函数
graph = [{"node": "A", ...props1}, {"node": "A", ... props2}]
的性质,你只会遇到第一个节点。index()
如果要查找每个节点"A"
,则需要index()
遍历所有列表,直到确定已找到所有节点"A"
,然后考虑节点属性的合并策略。
解决方案(推荐):
使用字典存储图的节点。字典具有恒定的时间查找 ( O(1) ),因为它们是哈希表。您希望实现的表示是:
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)
是
old_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}
]
new_graph = transform_graph(old_graph)
print(new_graph)
> {
'A': {'children': {'S', 'T', 'Z'}, 'gWt': {75, 118, 140}, 'h': 366},
'Z': {'children': {'A', 'O'}, 'gWt': {71, 75}, 'h': 374},
'T': {'children': {'A'}, 'gWt': {118}, 'h': 329},
'S': {'children': {'A', 'F', 'O', 'R'}, 'gWt': {80, 99, 140, 151}, 'h': 253}
}
推荐阅读
- c# - .NET Core Blazor:如果选中,如何获取复选框值?
- android - 禁用 Android Webview ChromeClient 的警报/弹出窗口
- android - Firestore OncompleteListener
- reactjs - React Native + Jest + Enzyme:为什么 Enzyme 不能识别某些组件?
- c++ - 如何将 C 函数指针迁移到 C++?
- java - 爪哇集
与设置 - >
- database - 大查询恢复表
- c - 为什么这个删除链表中第n个节点的程序无限运行?
- r - 增加乘数
- ios - 在带有后端的 iOS 应用程序中验证用户的最佳方式是什么?