首页 > 其他分享 >对json中的字典提取其中的所有参数(包括list和dict中)整合为一层

对json中的字典提取其中的所有参数(包括list和dict中)整合为一层

时间:2023-02-13 17:11:06浏览次数:38  
标签:list json dict result key extract

例如:在python中,我有一个字典,类似于{s1:[{s11:0,s12:2},{s13:3,s14:4}],s2:'s2',s3:{s31:0,s32:2}},我想使用递归提取其中所有的字典的key值和value,并在key值中包含它在字典中的位置信息,形成一个新的字段,如{s1_0_s11:0,s1_0_s12:2,s1_1_s13:3,s1_1_s14:4,s2:'s2',s3_s31:0,s3_s32:2}

import json
import multiprocessing
import os
from collections import defaultdict

def extract_dict(d, key_prefix = ""):
    result = {}
    for k, v in d.items():
        if isinstance(v, dict):
            result.update(extract_dict(v, key_prefix + k + "_"))
        elif isinstance(v, list):
            for i, item in enumerate(v):
                if isinstance(item, dict):
                    result.update(extract_dict(item, key_prefix + k + "_" + str(i) + "_"))
        else:
            result[key_prefix + k] = v
    return result


def merge_dicts(dict_list):
    merged_dict = defaultdict(list)
    for d in dict_list:
        for k, v in d.items():
            merged_dict[k].append(v)
    # 去重
    for k, v in merged_dict.items():
        merged_dict[k] = list(set(v))
    return dict(merged_dict)

def extract_dict_worker(json_file, dict_save = 'save-dict'):
    with open(json_file, "r") as f:
        d = json.load(f)
    result = extract_dict(d)
    del result['format_filename']
    with open(os.path.join(dict_save, os.path.basename(json_file)), 'w') as f:
        json.dump(result, f)
    result result
def extract_dicts_parallel(json_dir, n_workers=None):
    json_str_list = [os.path.join(json_dir, jd) for jd in os.listdir(json_dir)] 
    pool = multiprocessing.Pool(n_workers)
    result_list = pool.map(extract_dict_worker, json_str_list)
    pool.close()
    pool.join()
    # 对新的txt进行汇总,去重
    new_dict = merge_dicts(result_list)
    with open('merge_dict.json', 'w') as f:
        json.dump(new_dict, f)



if __name__ == '__main__':
    json_dir = './5000-json'
    # 多进程保存新的txt
    extract_dicts_parallel(json_dir, 20)

 

标签:list,json,dict,result,key,extract
From: https://www.cnblogs.com/chentiao/p/17117000.html

相关文章

  • Java Stream分组groupBy后,取某个字段值为字符串或者list
    某个字段值为字符串List<User>userList=newArrayList();Map<String,String>collect=userList.stream().collect(Collectors.groupingBy(User:......
  • Listener监听器概述 实现方式
    概念web的三大组件之一事件监听机制事件:一件事情事件源:事件发成的地方监听器:一个对象注册监听:将事件事件源监听器绑定在一......
  • Java-ArrayList.Itr类(Iterator的实现)
     本文转载自:Java-ArrayList.Itr类(Iterator的实现) 本文介绍java迭代器的实现之一,ArrayList类的迭代器实现本文示例代码如下publicstaticvoidmain(String[]args)......
  • 从List 删除元素开始说起
    前言写错过List删除元素的方法,看到过正确方法,老是记错,还是写篇文章记录一下,mark. 先看一段代码:classTestArrayListIterator{publicstaticvoidmain(String[......
  • List集合
    List集合​​1、List集合​​​​1.1List接口的方法​​​​1.2案例:元素的增删改查​​​​1.3List接口的实现类​​​​1.3.1ArrayList类​​​​1.3.2LinkedList类​......
  • redis命令操作list和set&sortedset以及通用命令
    列表类型list:可以添加一个元素到列表的头部(左边)或者尾部(右边) 1.添加: 1.lpushkeyvalue:将元素加入列表左表 2.rpushkeyvalue:将元素加入列表右边 ......
  • uni-app:使用uni-list显示列表数据之一(hbuilderx 3.6.18)
    一,演示代码:说明:演示代码中实现的功能:    1,各个列表项展示不同类型的内容    2,取消uni-list-item默认样式中的padding    3,  取消uni-list......
  • ChatGpt*u_ Predict the trend of U.S. stocks in 2023
    question:PredictthetrendofU.S.stocksin2023chatgpt: I'msorry,butasanAIlanguagemodel,Idonothavetheabilitytopredictfuturemarkettrends......
  • jQuery遍历List对象
    jQuery遍历List对象在​​jQuery​​​中,可以使用​​each()​​​方法以一种非常直观的方式来模拟​​break​​​和​​continue​​​关键字的功能。只需在回调函数中编......
  • Arrays.asList报错:java.lang.UnsupportedOperationException
    问题描述以下代码中,给List对象添加元素的时候,会报错packagecom.example;importjava.util.Arrays;importjava.util.List;publicclassDemo{publicstaticvoidmain......