Удалить дубликаты словарей и значения порядка, соответствующие ключам в списке - PullRequest
0 голосов
/ 29 апреля 2018

Это дополнительный вопрос к предыдущей проблеме: Рекурсивный доступ к путям и значениям вложенного словаря

Рассмотрим этот бессмысленный файл JSON с именем sample_dict: 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 голосов
/ 30 апреля 2018

Я мало работал с 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)

Затем вы можете перебрать список ключей, чтобы получить значения от каждого ключа в элементах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...