【问题标题】:Python json accessing an id in a nested dictionary and list based on it's valuePython json 访问嵌套字典中的 id 并根据其值列出
【发布时间】:2022-01-16 23:39:43
【问题描述】:

我有一个嵌套字典,其中包含我试图访问字典中包含我的 search_id 变量值的记录的列表。

如果不知道列表的索引号,我将如何访问具有 ='C0.N.01.B' 的 id 的节点

我只从嵌套字典中提取了一条记录来说明问题,但有数千条记录,所以我不能只指向索引或键/值而不使用变量。

我已经尝试了比下面的 cmets 更多的东西,但我重写了代码以使其最小化且可重现。

search_id = 'C0.N.01.B'

result = {'status': 'single', 'searchResult': {'id': 'C0.N.01.A', 'node': {'id': {'content': 'C0'}, 'label': {'content': 'Anatomical Therapeutic Chemical (ATC1-4)'}, 'sourceId': {'content': '0'}, 'numChildren': {'content': '14'}, 'numDrugs': {'content': '2755'}, 'node': [{'id': {'content': 'C0.A'}, 'label': {'content': 'ALIMENTARY TRACT AND METABOLISM'}, 'sourceId': {'content': 'A'}, 'numChildren': {'content': '16'}, 'numDrugs': {'content': '397'}, 'node': []}, {'id': {'content': 'C0.B'}, 'label': {'content': 'BLOOD AND BLOOD FORMING ORGANS'}, 'sourceId': {'content': 'B'}, 'numChildren': {'content': '5'}, 'numDrugs': {'content': '158'}, 'node': []}, {'id': {'content': 'C0.C'}, 'label': {'content': 'CARDIOVASCULAR SYSTEM'}, 'sourceId': {'content': 'C'}, 'numChildren': {'content': '9'}, 'numDrugs': {'content': '326'}, 'node': []}, {'id': {'content': 'C0.D'}, 'label': {'content': 'DERMATOLOGICALS'}, 'sourceId': {'content': 'D'}, 'numChildren': {'content': '11'}, 'numDrugs': {'content': '242'}, 'node': []}, {'id': 
{'content': 'C0.G'}, 'label': {'content': 'GENITO URINARY SYSTEM AND SEX HORMONES'}, 'sourceId': {'content': 'G'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '160'}, 'node': []}, {'id': {'content': 'C0.H'}, 'label': {'content': 'SYSTEMIC HORMONAL PREPARATIONS, EXCL. SEX HORMONES AND INSULINS'}, 'sourceId': {'content': 'H'}, 'numChildren': {'content': '5'}, 'numDrugs': {'content': '66'}, 'node': []}, {'id': {'content': 'C0.J'}, 'label': {'content': 'ANTIINFECTIVES FOR SYSTEMIC USE'}, 'sourceId': {'content': 'J'}, 'numChildren': {'content': '6'}, 'numDrugs': {'content': '334'}, 'node': []}, {'id': {'content': 'C0.L'}, 'label': {'content': 'ANTINEOPLASTIC AND IMMUNOMODULATING AGENTS'}, 'sourceId': {'content': 'L'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '324'}, 'node': []}, {'id': {'content': 'C0.M'}, 'label': {'content': 'MUSCULO-SKELETAL SYSTEM'}, 'sourceId': {'content': 'M'}, 'numChildren': {'content': '6'}, 'numDrugs': {'content': '130'}, 'node': []}, {'id': {'content': 'C0.N'}, 'label': {'content': 'NERVOUS SYSTEM'}, 'sourceId': {'content': 'N'}, 'numChildren': {'content': '7'}, 'numDrugs': {'content': '433'}, 'node': [{'id': {'content': 'C0.N.01'}, 'label': {'content': 'ANESTHETICS'}, 'sourceId': {'content': 'N01'}, 'numChildren': {'content': '2'}, 'numDrugs': {'content': '45'}, 'node': [{'id': {'content': 'C0.N.01.A'}, 'label': {'content': 'ANESTHETICS, GENERAL'}, 'sourceId': 
{'content': 'N01A'}, 'numChildren': {'content': '6'}, 'numDrugs': {'content': '26'}, 'node': []}, {'id': {'content': 'C0.N.01.B'}, 'label': {'content': 'ANESTHETICS, LOCAL'}, 'sourceId': {'content': 'N01B'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '19'}, 'node': []}]}, {'id': {'content': 'C0.N.02'}, 'label': {'content': 'ANALGESICS'}, 'sourceId': {'content': 'N02'}, 'numChildren': {'content': '3'}, 'numDrugs': {'content': '70'}, 'node': []}, {'id': {'content': 'C0.N.03'}, 'label': {'content': 'ANTIEPILEPTICS'}, 'sourceId': {'content': 'N03'}, 'numChildren': {'content': '1'}, 'numDrugs': {'content': '43'}, 'node': []}, {'id': {'content': 'C0.N.04'}, 'label': {'content': 'ANTI-PARKINSON DRUGS'}, 'sourceId': {'content': 'N04'}, 'numChildren': {'content': '3'}, 'numDrugs': {'content': '28'}, 'node': []}, {'id': {'content': 'C0.N.05'}, 'label': {'content': 'PSYCHOLEPTICS'}, 'sourceId': {'content': 'N05'}, 'numChildren': {'content': '3'}, 'numDrugs': {'content': '131'}, 'node': []}, {'id': {'content': 'C0.N.06'}, 'label': {'content': 'PSYCHOANALEPTICS'}, 'sourceId': {'content': 'N06'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '87'}, 'node': []}, {'id': {'content': 'C0.N.07'}, 'label': {'content': 'OTHER NERVOUS SYSTEM DRUGS'}, 'sourceId': {'content': 'N07'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '37'}, 'node': []}]}, {'id': {'content': 'C0.P'}, 'label': {'content': 'ANTIPARASITIC PRODUCTS, INSECTICIDES AND REPELLENTS'}, 'sourceId': {'content': 'P'}, 'numChildren': {'content': '3'}, 'numDrugs': {'content': '77'}, 'node': []}, {'id': {'content': 'C0.R'}, 'label': {'content': 'RESPIRATORY SYSTEM'}, 'sourceId': {'content': 'R'}, 'numChildren': {'content': '6'}, 'numDrugs': {'content': '213'}, 'node': []}, {'id': {'content': 'C0.S'}, 'label': {'content': 'SENSORY ORGANS'}, 
'sourceId': {'content': 'S'}, 'numChildren': {'content': '3'}, 'numDrugs': {'content': '174'}, 'node': []}, {'id': {'content': 'C0.V'}, 'label': {'content': 'VARIOUS'}, 'sourceId': {'content': 'V'}, 'numChildren': {'content': '9'}, 'numDrugs': {'content': '137'}, 'node': []}]}}, 'spellingResult': None, 'relatedTree': None, 'tableResult': None, 'synResult': None}

node = result['searchResult']['node']  # prints the dictionary
print(f'node: {node}')

id = result['searchResult']['node']['id']    # prints the first records key/value
print(f'id: {id}')

#id = result['searchResult']['node']['id']['C0.N.01.B']    # gives key error
#print(f'id: {id}')

#id = result['searchResult']['node']['id'].values({search_id})   # gives values takes no argument 1 given error
#print(f'id: {id}')

for search_id in result['searchResult']['node']:
        node_id = result['searchResult']['node']
        print(f'node id: {node_id}')        
        search_node_id = result['searchResult']['node']['id']['content']
        print(f'search node id: {search_node_id}')
        print(type(search_node_id)) 
        number_of_child = result['searchResult']['node']['numChildren']['content']
        print(f'number_of_child: {number_of_child}')
        print(type(number_of_child))
        number_of_drugs = result['searchResult']['node']['numDrugs']['content']
        print(f'number_of_drugs: {number_of_drugs}')
        print(type(number_of_drugs))
        class_source_id = result['searchResult']['node']['sourceId']['content']
        print(f'class_source_id: {class_source_id}')
        print(type(class_source_id))

这是我要访问的字典的记录。如何仅访问节点的 search_id = id 的记录?

'node': [{'id': {'content': 'C0.N.01.A'}, 'label': {'content': 'ANESTHETICS, GENERAL'}, 'sourceId': {'content': 'N01A'}, 'numChildren': {'content': '6'}, 'numDrugs': {'content': '26'}

【问题讨论】:

  • "这条记录的search_id = id的节点在哪里?"我不明白你的意思。在您显示的示例输入中,我没有看到任何名为 search_id 的内容。此外,由于示例中result 的格式,很难理解它的结构。
  • 顺便说一句,也许您可​​以想办法利用node_id = result['searchResult']['node'] 重命名来简化该循环中的其他代码行?
  • 这是第一行代码。在我的用例中,它是来自 api 调用的字典,但它显示了要点。

标签: python json list dictionary


【解决方案1】:

您可以使用递归函数搜索节点中的字典,如果搜索在此节点中则返回它,否则如果该节点有更多节点则搜索它们。

def search_nodes(nodes: list, search_content: str) -> dict:
    for node in nodes:
        if node['id']['content'] == search_content:
            return node
        if node['node']:
            response = search_nodes(node['node'], search_content)
            if response:
                return response

nodes = result['searchResult']['node']['node']  # gets the list of nodes
searched_node = search_nodes(nodes, search_id)
print(searched_node)

输出

{'id': {'content': 'C0.N.01.B'}, 'label': {'content': 'ANESTHETICS, LOCAL'}, 'sourceId': {'content': 'N01B'}, 'numChildren': {'content': '4'}, 'numDrugs': {'content': '19'}, 'node': []}

【讨论】:

  • 谢谢你,克里斯,这正是我所需要的。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多