【问题标题】:Get keys from dictionary, nested dictionary, lists and check how many times it appears从字典、嵌套字典、列表中获取键并检查它出现的次数
【发布时间】:2021-02-08 21:01:38
【问题描述】:

所以基本上,我正在尝试编写一个从 json 文件中获取字典的代码。该词典包含其他词典、列表等... 我正在尝试从 json(results,x1,x2,x3,y1,y2,a1,b1) 中获取所有键,并在检查嵌套字典和列表时显示每个键出现了多少次。

代码:

# open data
import json

with open('list.json') as f:
    my_dict = json.load(f)

k=int()

def count_k_v(k):
        keys=0
        if type(k)==dict:
            for value in k.keys():
                if isinstance(k[value], (dict,list)):
                    keys+=1
                    k=count_k_v(k[value])
                    keys+=k
                else:
                    keys+=1
        elif type(k)==list:
            for value in k:
                if isinstance(value,(list,dict)):
                    k=count_k_v(value)
                    keys+=k
                else:
                    keys+=1
        return keys


#['results','x1','x2','y1','x3','y2','a1','b1']     
for key, value in my_dict:
    print("{}".format(key,value))   

#FOUND 8 KEYS.
print("Found {} keys.",count_k_v(my_dict))

#RESULTS FOUND 1 TIME
#X1 KEY FOUND 1 TIME
#X2 KEY FOUND 1 TIME
#Y1 KEY FOUND 1 TIME
#X3 KEY FOUND 1 TIME
#Y2 KEY FOUND 1 TIME
#A1 KEY FOUND 1 TIME
#B1 KEY FOUND 1 TIME
for key in my_dict:

JSON:

{
   "results":[
      {
         "x1":5
      },
      {
         "x2":5,
         "y1":[
            1,
            2,
            3
         ]
      },
      {
         "x3":5,
         "y2":{
            "a1":2,
            "b1":67
         }
      }
   ]
}

尝试打印:

['results','x1','x2','y1','x3','y2','a1','b1']
FOUND 8 KEYS.
RESULTS FOUND 1 TIME
X1 KEY FOUND 1 TIME
X2 KEY FOUND 1 TIME
Y1 KEY FOUND 1 TIME
X3 KEY FOUND 1 TIME
Y2 KEY FOUND 1 TIME
A1 KEY FOUND 1 TIME
B1 KEY FOUND 1 TIME

【问题讨论】:

    标签: python json list dictionary


    【解决方案1】:

    您可以使用递归方法,collections.Counter:

    from collections import Counter
    def get_result(d):
        keys = []
    
        def recurse(d):
            if isinstance(d, dict):
                for k, v in d.items():
                    keys.append(k)
                    if isinstance(v, (dict, list)):
                        recurse(v)
    
            elif isinstance(d, list):
                for item in d:
                    if isinstance(item, (dict, list)):
                        recurse(item)
            else:
                return
        recurse(d)
        print(keys)
        print(f'found {len(keys)} keys.'.upper())
        for k, v in Counter(keys).items():
            print(f'{k} key found {v} time'.upper())
    
    get_result(my_dict)
    

    输出:

    ['results', 'x1', 'x2', 'y1', 'x3', 'y2', 'a1', 'b1']
    FOUND 8 KEYS.
    RESULTS KEY FOUND 1 TIME
    X1 KEY FOUND 1 TIME
    X2 KEY FOUND 1 TIME
    Y1 KEY FOUND 1 TIME
    X3 KEY FOUND 1 TIME
    Y2 KEY FOUND 1 TIME
    A1 KEY FOUND 1 TIME
    B1 KEY FOUND 1 TIME
    

    或者,您可以只用re 解析json string [不完全证明,推荐用于简单的json]:

    import re
    
    def get_result(json_str):
        keys = re.findall(r'"([^"]+?)"\s*:', json_str)
        print(keys)
        print(f'found {len(keys)} keys'.upper())
        for k, v in Counter(keys).items():
            print(f'{k} key found {v} time'.upper())
    
    print(get_result(json.dumps(my_dict)))
    

    输出:

    ['results', 'x1', 'x2', 'y1', 'x3', 'y2', 'a1', 'b1']
    FOUND 8 KEYS.
    RESULTS KEY FOUND 1 TIME
    X1 KEY FOUND 1 TIME
    X2 KEY FOUND 1 TIME
    Y1 KEY FOUND 1 TIME
    X3 KEY FOUND 1 TIME
    Y2 KEY FOUND 1 TIME
    A1 KEY FOUND 1 TIME
    B1 KEY FOUND 1 TIME
    

    【讨论】:

    • 感谢您的快速回复!我要检查递归函数。
    猜你喜欢
    • 2021-05-10
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2012-05-21
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多