删除与列表中的键对应的重复词典和订单值

时间:2018-04-29 20:58:12

标签: python json python-2.7 list dictionary

这是我之前的问题的后续问题:Recursively accessing paths and values of a nested dictionary

考虑这个名为sample_dict的无意义JSON文件:https://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    []

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

1 个答案:

答案 0 :(得分:0)

我没有使用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)

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