Кто-нибудь знает, где есть рецепт для сериализации данных и сохранения их порядка в выводе?

1

Я работаю с набором данных, которые я преобразовал в список словарей

Например, один элемент в моем списке

{'reportDate': u'R20070501', 'idnum': u'1078099', 'columnLabel': u'2005',
 'actionDate': u'C20070627', 'data': u'76,000', 'rowLabel': u'Sales of Bananas'}

За запрос

Второй элемент в моем списке может быть:

 {'reportDate': u'R20070501', 'idnum': u'1078099', 'columnLabel': u'2006',
 'actionDate': u'C20070627', 'data': u'86,000', 'rowLabel': u'Sales of Bananas'}

Третий элемент может быть:

 {'reportDate': u'R20070501', 'idnum': u'1078100', 'columnLabel': u'Full Year 2005',
 'actionDate': u'C20070627', 'data': u'116,000', 'rowLabel': u'Sales of Cherries'}

Четвертый элемент может быть:

 {'reportDate': u'R20070501', 'idnum': u'1078100', 'columnLabel': u'Full Year 2006',
 'actionDate': u'C20070627', 'data': u'76,000', 'rowLabel': u'Sales of Sales of Cherries'}

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

Я тестировал рассол и смог сохранить и получить мои данные. Однако мне нужно сохранить порядок в выходе. Одна из моих идей - добавить еще один ключ, который будет счетчиком, чтобы я мог получить мои данные, а затем сортировать по счетчику. Есть ли лучший способ?

Я не хочу помещать это в базу данных, потому что он не является постоянным.

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

  • 0
    Как насчет отображения более одной строки? Если есть несколько строк И вы хотите сохранить порядок между строками, то лучший пример поможет объяснить вещи.
Теги:
serialization

3 ответа

5
Лучший ответ

Так что же с рассолом? Если вы структурируете свои данные в виде списка dicts, тогда все должно работать так, как вы хотите (если я понимаю вашу проблему).

>>> import pickle
>>> d1 = {1:'one', 2:'two', 3:'three'}
>>> d2 = {1:'eleven', 2:'twelve', 3:'thirteen'}
>>> d3 = {1:'twenty-one', 2:'twenty-two', 3:'twenty-three'}
>>> data = [d1, d2, d3]
>>> out = open('data.pickle', 'wb')
>>> pickle.dump(data, out)
>>> out.close()
>>> input = open('data.pickle')    
>>> data2 = pickle.load(input)
>>> data == data2
True
1

Python не сохраняет порядок в словарях.
Однако в модуле коллекций есть класс OrderedDict.

Другой вариант - использовать список кортежей:

[('reportDate', u'R20080501'), ('idnum', u'1078099'), ...etc]

Вы можете использовать встроенный dict(), если вам нужно позже его преобразовать в словарь.

1

Python dict - неупорядоченный контейнер. Если вам нужно сохранить порядок записей, вам следует использовать список из 2-х кортежей.

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

data = {'reportDate': u'R20070501', 'idnum': u'1078099', 
        'columnLabel': u'2005', 'actionDate': u'C20070627', 
        'data': u'76,000', 'rowLabel': u'Sales of Bananas'}
dataOrder = ['reportDate', 'idnum', 'columnLabel', 
             'actionDate', 'data', 'rowLabel']

for key in dataOrder:
    print key, data[key]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню