【问题标题】:How to extract text from the deepest level of a nested dict file?如何从嵌套字典文件的最深层提取文本?
【发布时间】:2017-05-21 18:27:50
【问题描述】:

这个问题是What is the most efficient way to extract info from complex JSON files?的后续问题

我有大量的 dict 文件,其结构可以是任意的。当没有额外的嵌套时,我想捕获所有带有“text”键的字符串以及所有带有“htext”键的字符串。

d = {
        "section": {
                   "heading":{"lvl":"A1", "text":"today"},
                   "htext":[
                                {"color":"green",  "text":"yesterday", "htext":["a","b","c"]},
                                {"color":"purple", "text":"tomorrow"}
                               ]
                   }
         }

在上面的例子中,我希望我的结果是["today", "yesterday", "a", "b", "c", "tomorrow"]

上一题提供的解决方案是:

def extract_text(obj, acc):
    if isinstance(obj, dict):
        for k, v in obj.items():
            if isinstance(v, (dict, list)):
                extract_text(v, acc)
            elif k == "text":
                acc.append(v)
    elif isinstance(obj, list):
        for item in obj:
            extract_text(item, acc)

我尝试通过将k == 'htext' 添加到elif 语句来修改此功能,但没有成功。我对 Python 有新的认识。非常感谢任何帮助!

【问题讨论】:

    标签: python json dictionary recursion


    【解决方案1】:

    试试这个:

    d = {
            "section": {
                       "heading":{"lvl":"A1", "text":"today"},
                       "htext":[
                                    {"color":"green",  "text":"yesterday", "htext":["a","b","c"]},
                                    {"color":"purple", "text":"tomorrow"}
                                   ]
                       }
             }
    
    acc = [];
    
    def extract_text(obj, acc):
         if isinstance(obj, dict):
             for k, v in obj.items():
                 if isinstance(v, dict):
                     extract_text(v, acc)
                 elif k == "text":
                     acc.append(v)
                 elif k == "htext" and isinstance(v, list) and all([isinstance(item, str) for item in v]):
                     for item in v:
                         acc.append(item)
                 elif isinstance(v, list):
                     extract_text(v, acc)
         elif isinstance(obj, list):
             for item in obj:
                 extract_text(item, acc)
    
    
    extract_text(d, acc)
    print(acc)
    

    【讨论】:

      【解决方案2】:

      您可以检查键是否为“htext”,值是否为非嵌套列表:

      def extract_text(obj, acc):
          if isinstance(obj, dict):
              for k, v in obj.items():
                if k == "htext" and isinstance(v, list) and not isinstance(v[0], (dict, list)):
                   for x in v:
                     acc.append(x) 
                elif isinstance(v, (dict, list)):
                    extract_text(v, acc)
                elif k == "text":
                    acc.append(v)
      
          elif isinstance(obj, list):
              for item in obj:
                  extract_text(item, acc)
      
      #=> ['yesterday', 'a', 'b', 'c', 'tomorrow', 'today']
      

      【讨论】:

        猜你喜欢
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 2013-07-25
        • 2021-10-12
        • 2016-05-06
        • 1970-01-01
        • 2019-01-01
        相关资源
        最近更新 更多