2012-02-15 3 views
2

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

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

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

sheet = [['ACCOUNT', 'VALUE1', 'VALUE2', 'VALUE3'], 
     ['Account1', '3.4332', '2.524', '4,567.23'], 
     ['Account2', '1,235.67', '8.98', '4,321.78']] 

Как я мог установить это, используя (вложенными?) Словари, так что я могу получить доступ к значениям помечена знаком " Учетная запись "и ключ заголовка? (в основном легко получить доступ к Account1, Value2)

Я бы предпочел, чтобы реализация была эффективной с точки зрения производительности при итерации по учетным записям и извлечении пар счёта/стоимости для сравнения/мутации. (Я делаю много анализа массивов с одного дня на следующий, где структура массива остается неизменной, но числовые данные изменяются).

+0

Вы действительно сталкиваетесь с проблемами производительности с вашим текущим подходом? –

ответ

3
row_iter = iter(sheet) 
keys = next(row_iter)[1:] 
data = {} 
for row in row_iter: 
    data[row[0]] = dict(zip(keys, row[1:])) 

создает Словаре

{'Account1': {'VALUE1': '3.4332', 'VALUE2': '2.524', 'VALUE3': '4,567.23'}, 
'Account2': {'VALUE1': '1,235.67', 'VALUE2': '8.98', 'VALUE3': '4,321.78'}} 

Вы можете теперь доступ к полю, например, посредством data['Account1']['VALUE2'].

+0

Для меня код для 'data ['Account1'] ['VALUE2']' намного проще читать, но - не считая накладных расходов на построение словарей - он более «эффективен»? Кажется, что один 2D-массив будет занимать меньше места и выполнять быстрее, чем вложенные словари. –

1
sheet = {'Account1': {'Value1': '3.4332', 'Value2': '2.524', 'Value3': '4,567.23'}, 
     'Account2': {'Value1': '1,235.67', 'Value2': '8.98', 'Value3': '4,321.78'}} 

>>> sheet['Account1']['Value2'] 
'2.524' 
1

Вы должны использовать numpy. Этот пакет имеет очень эффективную реализацию 2d-массивов.

1

Я бы сохранил данные в 2-й матрице, а затем использовал словари для поиска столбцов/строк по имени.

1

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

columns = {'VALUE1': 1, 'VALUE2': 2, 'VALUE3': 3} 
sheet = { 
     'Account1': ['3.4332', '2.524', '4,567.23'], 
     'Account2': ['1,235.67', '8.98', '4,321.78'], 
     } 

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

, если поиск будет выглядеть следующим образом:

val = sheet['Account1'][columns['VALUE2']] 

dict из namedtuple s будет также способ сделать это эффективно, вместо того, dict из list S + в dict ключей.