2015-05-26 4 views
1

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

dict имеет следующий формат:

str1: [(int1, bool), (int2, bool), ... ], 
str2: [(int1, bool), (int2, bool), (int3, bool), ... ], 
... 
strN ... 

То, что я хочу достичь, это таблица, которая выглядит примерно так:

 int1 int2 int3 
str1 bool bool 
str2 bool bool bool 

Есть ли способ сделать это без написания долго алгоритм с дюжиной на вложенных fors и ifs? Не просить написать это для меня, а всего лишь намек на правильное направление.

Я просто хочу знать, как манипулировать данными в подобном формате. Было бы здорово, если бы это было совместимо, записывая его в CSV или, в идеале, файл Excel.

+1

являются те, на самом деле _strings_, и вы спрашиваете, как разобрать их в кортежах списки кортежей, или у вас уже есть кортежей списков кортежей, и вы спрашиваете, как сопоставить их с таблицей? – abarnert

+0

Вы на самом деле пытались написать код самостоятельно? –

+0

@abarnert Привет, данные уже имеют структуру, описанную выше (первый раздел кода). –

ответ

0

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

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

0

Выглядит довольно прямо, так что;

  • Импорт библиотека для JSON синтаксического анализа
  • импортировать библиотеку для CSV написание

Затем разобрать JSON в структуру данных (предположительно map или list с array) и записать его в CSV, проанализировав эту структуру данных.

Если структура данных не соответствует требуемому формату, то используйте простой for loop, который будет m официровать и преобразовать структуру данных.

Для решения проблемы эффективности;

  • Использование библиотек обычно дает хорошую эффективность в общих случаях по сравнению с написанием самого первого анализатора или писателя.
  • Содержит любые манипуляции с данными в малой петле, зажатой между этапами синтаксического анализа и записи, чтобы вы могли легко и легко распознавать ваш основной алгоритм, и, следовательно, надеяться, что он будет эффективным.
+0

Привет, спасибо за ваш ответ, но на самом деле я не отвечаю на мой вопрос. Я знаю, как импортировать библиотеки json и csv, и я знаю, как их использовать. На самом деле у меня уже есть структура, которую я проанализировал из json-файла. Я просто спрашиваю о способе преобразования этой структуры в другую. –

0

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

Один из очевидных способов хранения 2D-таблицы с разреженными осями - с помощью диктата, с ключением значений int и str.Например:

d = defaultdict(dict) 
seen_ints = set() 
for s, pairs in rows: 
    for i, b in pairs: 
     d[s][i] = b 
     seen_ints.add(i) 

Теперь, чтобы получить строки, вы просто перебирать d[s].items(). Или, если вы хотите, чтобы они отсортированы по порядку строк, выполните итерацию sorted(d[s].items()). Каждая строка - это dict; чтобы получить столбцы в желаемом порядке, вы просто получаете доступ к row[key] for key in seen_ints. (Если вы хотите, чтобы столбцы отсортированные тоже, просто сделать seen_ints = sorted(seen_ints) до внешнего контура.)

Или вы можете использовать csv.DictWriter уронить seen_ints набор и просто выписывать каждую строку dict в виде строки CSV.

3

Если вы разобрали JSON в data, который выглядит как

data = { 
    'str1': [('int1', 'bool'), ('int2', 'bool')], 
    'str2': [('int1', 'bool'), ('int2', 'bool'), ('int3', 'bool')] } 

, то вы можете загрузить его в Pandas DataFrame с

import pandas as pd 
df = pd.DataFrame({key:pd.Series(dict(seq)) for key, seq in data.items()}).T 

так, что урожайность

print(df) 

 int1 int2 int3 
str1 bool bool NaN 
str2 bool bool bool 

и

df.to_csv('/tmp/out.csv') 

производит CSV с содержанием

,int1,int2,int3 
str1,bool,bool, 
str2,bool,bool,bool 
Смежные вопросы