Python 如何在具有嵌套键和值的Json文件中搜索特定关键字?

Python 如何在具有嵌套键和值的Json文件中搜索特定关键字?,python,json,list,dictionary,Python,Json,List,Dictionary,我是python的初学者,我试图在Json文件中搜索特定的关键字。我一直在阅读python中词典和列表的工作原理,我发现: complex_list = [["a",["b",["c","x"]]],42] complex_list[0][1] output: ['b', ['c', 'x']] complex_list[0][1][1][0] output: 'c' 据我所知,在复杂的列表[0][1]中,[0]是整个括号[,],而[1]访问括号的第二部分:[,[this]] 现在,这个:co

我是python的初学者,我试图在Json文件中搜索特定的关键字。我一直在阅读python中词典和列表的工作原理,我发现:

complex_list = [["a",["b",["c","x"]]],42]
complex_list[0][1]
output: ['b', ['c', 'x']]
complex_list[0][1][1][0]
output: 'c'
据我所知,在复杂的列表[0][1]中,
[0]
是整个括号
[
]
,而
[1]
访问括号的第二部分:
[,[this]]

现在,这个:
complex_list=[[a]、[b]、[c”、“x”]],42]
,列表中有2个元素,对吗?a、 b、c和x属于一组,42属于第二组。我不知道如何解释这一点:
复杂列表[0][1][1][0]
访问
'c'

有人能把它拆开吗?我问这个问题是因为我认为这就是我需要用来解决我在下面解释的问题的方法

这是我目前正在处理的文件中的一个小样本:

{ (white)

  "results": [
    { (black)
      "Fruit": "Apple",
      "Nested fruit": [
        "Orange"
      ],
      "Title1": "Some text",
      "Contents": { (yellow)
        "Name 1": [
          "John Smith"
        ],
        "Name 2": [
          "Tyler"
        ],
        "Name 3": [
          "Bob",
          "Rob"
        ],
        "Name 4": [
          "Linda"
        ],
        "Name 5": [
          "Mark",
          "Matt"
        ],
        "Some boolean": [
          true
        ]
      }, (yellow)

      "More stuff": "More random text",
      "Confusing": [
        { (red)
          "Some info": "456",
          "Info I want": "849456"
        } (red)
      ],
      "Not important": [
        { (blue)
          "random text": "bla",
          "random text2": "bla bla"
        } (blue)
      ],
      "Not important 2": "000",
      "Not important3": [
        "whatever",
        "whatever"
      ],
      "Not important 4": "16",
      "Not important 5": "0058"
    } (black)
  ]
} (white)
我把颜色放在括号里,放在相应的花括号旁边,这样很容易区分。以下是一些在线示例,我发现:

import json

    with open('searchingKeywords.json') as f:
        data = json.load(f)
    print(data.keys())

    for k in data:
        for v in data[k]:
            if 'More stuff' in v:
                print("yes")
其中打印:

dict_keys(['results'])
yes

只有一个键,但是内容呢?这不是结果中的另一个关键因素吗?我很困惑。我感兴趣的是“混乱”中的“我想要的信息”。如果包含关键字“我想要的信息”,我如何在这么多嵌套的东西中搜索?起初,我尝试逐行阅读——一旦我将Json文件解析为Python对象——然后查看是否在每行中都找到关键字“Info I want”,但我不断地出错。此外,我正在处理的文件很大,“我想要的信息”可能嵌套方式不同

如评论中所述,作品中未被接受的答案完全适合您的情况:

data = {
  "results": [
    {
      "Fruit": "Apple",
      "Nested fruit": [
        "Orange"
      ],
      "Title1": "Some text",
      "Contents": {
        "Name 1": [ 
          "John Smith"
        ],
        "Name 2": [
          "Tyler"
        ],
        "Name 3": [
          "Bob",
          "Rob"
        ],
        "Name 4": [
          "Linda"
        ],
        "Name 5": [
          "Mark",
          "Matt"
        ],
        "Some boolean": [
          True
        ]
      },
      "More stuff": "More random text",
      "Confusing": [
        {
          "Some info": "456",
          "Info I want": "849456"
        }
      ],
      "Not important": [
        {
          "random text": "bla",
          "random text2": "bla bla"
        }
      ],
      "Not important 2": "000",
      "Not important3": [
        "whatever",
        "whatever"
      ],
      "Not important 4": "16",
      "Not important 5": "0058"
    }
  ]
}


def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.items():
            if k == lookup_key:
                yield v
            else:
                yield from item_generator(v, lookup_key)
    elif isinstance(json_input, list):
        for item in json_input:
            yield from item_generator(item, lookup_key)


res = item_generator(data, 'More stuff')
print([x for x in res])

res = item_generator(data, 'Info I want')
print([x for x in res])
输出:

['More random text']
['849456']

这回答了你的问题吗?复杂列表是一个包含两个元素的列表。请记住,Python从0开始计数,因此列表中的第一个元素(元素0)是[“a”、[“b”、[“c”、“x”]],第二个元素(元素1)是42。现在,第一个元素也是一个包含两个元素的列表:“a”和[“b”,“c”,“x”]],第二个元素是一个包含两个元素的列表:“b”和[“c”,“x”]。最后,第二个元素是一个包含两个元素的列表:“c”和“x”。所以,我们有复杂列表[0][0]:“a”,复杂列表[0][1][0]:“b”,复杂列表[0][1][1][0]:“c”,复杂列表[0][1][1]:“x”和复杂列表[1]:“42”。@Maurice Meyer这没有帮助,但谢谢你。谢谢@matnor。我现在明白了。嗯,它对我不起作用,因为我试图理解代码,并根据我理解代码的方式对其进行了修改。我会再试一次,然后我会发布更新,谢谢!谢谢你@Maurice Meyer。我从不复制和粘贴代码,因为我总是试图理解首先发生的事情。我正在阅读您提供的链接中的所有答案,并尝试编写自己的代码。我现在要分析这段代码,看看它是如何工作的:再次感谢!