首页 > 解决方案 > 删除与列表中的键对应的重复字典和排序值

问题描述

这是我之前遇到的问题的后续问题:递归访问嵌套字典的路径和值

考虑这个无意义的 JSON 文件,名为sample_dicthttps ://jsoneditoronline.org/?id=da7a486dc2e24bf8b94add9f04c71b4d

给定这里的代码:

import json
import csv

json_sample = 'sample_dict.json'
json_file = open(json_sample, 'r')
json_data = json.load(json_file)

csv_file = open('sample_dict.csv', 'w')

items = json_data['sample_dict']

# Thanks @fferri!
def visit_dict(d, path=[]):
    for k, v in d.items():
        if not isinstance(v, dict):
            yield path + [k], v
        else:
            for visits in visit_dict(v, path + [k]):
                yield visits

for key in items:
    csv_file.write(','.join('/'.join(k) for k, v in visit_dict(key)))

csv_file.write('\n')

for value in items:
    csv_file.write(','.join(str(v) for k, v in visit_dict(value)))

在这里,它打印出列表中的 2 个字典,包括重复的字典。有问题的问题是:

理想的输出是这样的:

dict_id person  person/person_id    person/name person/age  family  family/person_id    family/members  family/members/father   family/members/mother   family/members/son  family/family_id    color   items_id    furniture   furniture/type  furniture/color furniture/size  furniture/purchases
5   None    15  Martin  18  None    20      Jose    Maddie  Jerry   2   Red None    None    Chair   Brown   Large   []
10  None    20  Zeeshan 25  None    None    None    None    None    None    None    None    None    Table   Blue    Blue    None    []

请原谅格式错误,但每行中的每个值都应对应于每个列标题。

标签: pythonjsonpython-2.7listdictionary

解决方案


我对 json 或 dicts 的工作不多,但我知道 dict 没有排序。如果您想要订单,则必须将键/值对移动到可排序的位置,然后对其进行排序。

我不太确定您所说的“重复”是什么意思

当您使用 csv 进行打印时,输出将以逗号分隔。如果要在列标题下打印值,则必须获取每个标题和每个值的长度,将单元格长度设置为较大的值,并在写入文件之前为较短的字符串添加填充。

重复

好的我明白了。我没有尝试通过列表理解来做到这一点,但使用循环很容易:

key_list = []
for key in items:
    for k, v in visit_dict(key):
        if k not in key_list: key_list.append(k)

然后,您可以遍历键列表以从项目中的每个键获取值。


推荐阅读