wangjianweiwei / blog

点滴记录
1 stars 0 forks source link

递归的应用 #10

Open wangjianweiwei opened 4 years ago

wangjianweiwei commented 4 years ago

昨天业务有个需求, 这个需求经过我的抽象之后,其实就是做一个json的对比,但是这个json的数据结果比较深,第一个痛点就是存在层次的结果没有办法好好的进行线性对比,我的想法是把json转成一个线性的东西,这个想法有点像矩阵的转置,于是我就想到到递归,采用递归的方法记录json的每个值的路径,这么说可能不太容易理解,我举个例子

a = {
    "张三": [
        {"month": "一月", "baseSalary": 8000, "royalty": 3000},
        {"month": "二月", "baseSalary": 9000, "royalty": 2000},
        {"month": "三月", "baseSalary": 7000, "royalty": 7000},
        {"month": "四月", "baseSalary": 6000, "royalty": 9000},
        {"month": "五月", "baseSalary": 9000, "royalty": 7000},
        {"month": "六月", "baseSalary": 10000, "royalty": 8000},
        {"month": "七月", "baseSalary": 6000, "royalty": 10000},
        {"month": "八月", "baseSalary": 5000, "royalty": 2000},
        {"month": "九月", "baseSalary": 8400, "royalty": 1900},
        {"month": "十月", "baseSalary": 6700, "royalty": 1890},
        {"month": "十一月", "baseSalary": 9200, "royalty": 2400},
        {"month": "十二月", "baseSalary": 4200, "royalty": 5380},
    ]
}

结果就是这样的

张三.0.month.一月
张三.0.baseSalary.8000
张三.0.royalty.3000
张三.1.month.二月
张三.1.baseSalary.9000
张三.1.royalty.2000
张三.2.month.三月
张三.2.baseSalary.7000
张三.2.royalty.7000
张三.3.month.四月
张三.3.baseSalary.6000
张三.3.royalty.9000
张三.4.month.五月
张三.4.baseSalary.9000
张三.4.royalty.7000
张三.5.month.六月
张三.5.baseSalary.10000
张三.5.royalty.8000
张三.6.month.七月
张三.6.baseSalary.6000
张三.6.royalty.10000
张三.7.month.八月
张三.7.baseSalary.5000
张三.7.royalty.2000
张三.8.month.九月
张三.8.baseSalary.8400
张三.8.royalty.1900
张三.9.month.十月
张三.9.baseSalary.6700
张三.9.royalty.1890
张三.10.month.十一月
张三.10.baseSalary.9200
张三.10.royalty.2400
张三.11.month.十二月
张三.11.baseSalary.4200
张三.11.royalty.5380

很遗憾这个需求被砍了。 实现的代码在下面,用python写的

def transposition(data: dict, prefix: list = None):
    prefix = prefix[:] if prefix else []

    if isinstance(data, dict):
        for k, v in data.items():
            if isinstance(v, dict):
                yield from transposition(v, prefix=prefix + [str(k)])
            elif isinstance(v, list):
                for index, ele in enumerate(v):
                    yield from transposition(data=ele, prefix=prefix + [str(k)] + [str(index)])
            else:
                yield prefix + [str(k)] + [str(v)]
    else:
        yield prefix + [str(data)]

注意yield from语法, 应该是python的版本>=3.3才可以用哦