Наиболее эффективная реализация данных электронных таблиц - PullRequest
2 голосов
/ 15 февраля 2012

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

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 15 февраля 2012
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'].

1 голос
/ 15 февраля 2012

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

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']]

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

1 голос
/ 15 февраля 2012

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

1 голос
/ 15 февраля 2012

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

1 голос
/ 15 февраля 2012
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'
...