Реорганизация базы данных JSON для удаления дубликатов

Сейчас моя база данных JSON выглядит так:

[{'srcStationName': 'Central', 'srcStationID': 1, 'dstName': 'Central', 
 'dstID': 1, 'octopusAdultFare': 0, 'octopusStudentFare': 0, 
 'singleAdultFare': 0, 'octopusChildFare': 0, 'octopusElderlyFare': 0, 
 'octopusDisabledFare': 0, 'singleChildFare': 0, 'singleElderlyFare': 0},
 {'srcStationName': 'Central', 'srcStationID': 1, 'dstName': 'Admiralty', 
 'dstID': 2, 'octopusAdultFare': 4.6, 'octopusStudentFare': 3, 
 'singleAdultFare': 5, 'octopusChildFare': 3, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleChildFare': 3, 'singleElderlyFare': 3},
 {'srcStationName': 'Central', 'srcStationID': 1, 'dstName': 'Tsim Sha Tsui', 
 'dstID': 3, 'octopusAdultFare': 10, 'octopusStudentFare': 5, 
 'singleAdultFare': 11, 'octopusChildFare': 5, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleChildFare': 5, 'singleElderlyFare': 5},

 {'srcStationName': 'Heng On', 'srcStationID': 101, 'dstName': 'Fortress 
 Hill', 'dstID': 30, 'octopusAdultFare': 21.5, 'octopusStudentFare': 10.7, 
 'singleAdultFare': 24, 'octopusChildFare': 10.7, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleChildFare': 12, 'singleElderlyFare': 12},
 {'srcStationName': 'Heng On', 'srcStationID': 101, 'dstName': 'North Point', 
 'dstID': 31, 'octopusAdultFare': 21.5, 'octopusStudentFare': 10.7, 
 'singleAdultFare': 24, 'octopusChildFare': 10.7, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleChildFare': 12, 'singleElderlyFare': 12},
 {'srcStationName': 'Heng On', 'srcStationID': 101, 'dstName': 'Quarry Bay', 
 'dstID': 32, 'octopusAdultFare': 21.5, 'octopusStudentFare': 10.7, 
 'singleAdultFare': 24, 'octopusChildFare': 10.7, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleChildFare': 12, 'singleElderlyFare': 12}] 

Поскольку существуют одни и те же «srcStations» и несколько «назначений», желаемый результат - я хочу преобразовать в формат, как показано ниже:

{1: {1: {'octopusAdultFare': 0, 'octopusStudentFare': 0, 'octopusChildFare': 
 0, 'octopusElderlyFare': 0, 'octopusDisabledFare': 0, 'singleAdultFare': 0, 
 'singleChildFare': 0, 'singleElderlyFare': 0}, 2: {'octopusAdultFare': 4.6, 
 'octopusStudentFare': 3, 'octopusChildFare': 3, 'octopusElderlyFare': 2, 
 'octopusDisabledFare': 2, 'singleAdultFare': 5, 'singleChildFare': 3, 
 'singleElderlyFare': 3}, 3: {'octopusAdultFare': 10, 'octopusStudentFare': 
 5, 'octopusChildFare': 5, 'octopusElderlyFare': 2, 'octopusDisabledFare': 2, 
 'singleAdultFare': 11, 'singleChildFare': 5, 'singleElderlyFare': 5},

 101: {1: {'octopusAdultFare': 21.5, 'octopusStudentFare': 10.7
 'octopusChildFare': 10.7, 'octopusElderlyFare': 2, 'octopusDisabledFare': 
 2, 'singleAdultFare': 24, 'singleChildFare': 12, 'singleElderlyFare': 12}, 
 2: {'octopusAdultFare': 21.5, 'octopusStudentFare': 10.7, 'octopusChildFare': 
 10.7, 'octopusElderlyFare': 2, 'octopusDisabledFare': 2, 
 'singleAdultFare': 24, 'singleChildFare': 12, 'singleElderlyFare': 12}, 3: {'octopusAdultFare': 
 21.5, 'octopusStudentFare': 10.7, 'octopusChildFare': 10.7, 
 'octopusElderlyFare': 2, 'octopusDisabledFare': 2, 'singleAdultFare': 
 24, 'singleChildFare': 12, 'singleElderlyFare': 12}
}

Где первая цифра «1» и ключ «101» - это «srcStationID», а соответствующий объект содержит «dstID» в качестве ключей и их цены. Мне нужна помощь в написании функции на Python, которая выполнит это преобразование за меня и запишет результат в файл JSON. Спасибо.

Можете ли вы сами продемонстрировать усилия любой в решении этой проблемы?

Scott Hunter 24.07.2018 04:13

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

Chris 24.07.2018 04:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
17
1

Ответы 1

Мне удалось это сделать с помощью следующего кода:

newData = []
entities = {}
for entity in data:
    if not entity['srcStationID'] in entities:
        entities[entity['srcStationID']] = {
            entity['dstID'] : {
                'octopusAdultFare' : entity.get('octopusAdultFare'),
                'octopusStudentFare' : entity.get('octopusStudentFare'),
                'octopusChildFare' : entity.get('octopusChildFare'),
                'octopusElderlyFare' : entity.get('octopusElderlyFare'),
                'octopusDisabledFare' : entity.get('octopusDisabledFare'),
                'singleAdultFare' : entity.get('singleAdultFare'),
                'singleChildFare' : entity.get('singleChildFare'),
                'singleElderlyFare' : entity.get('singleElderlyFare')
            }
        }
    else:
        entities[entity['srcStationID']][entity['dstID']] = {
            'octopusAdultFare' : entity.get('octopusAdultFare'),
            'octopusStudentFare' : entity.get('octopusStudentFare'),
            'octopusChildFare' : entity.get('octopusChildFare'),
            'octopusElderlyFare' : entity.get('octopusElderlyFare'),
            'octopusDisabledFare' : entity.get('octopusDisabledFare'),
            'singleAdultFare' : entity.get('singleAdultFare'),
            'singleChildFare' : entity.get('singleChildFare'),
            'singleElderlyFare' : entity.get('singleElderlyFare')
        }

Другие вопросы по теме