Мой сценарий выглядит следующим образом: у меня есть таблица данных (несколько полей, не более ста строк), которые я широко использую в своей программе. Мне также нужны эти данные, чтобы они были постоянными, поэтому я сохраняю его как CSV и загружаю его при запуске. Я предпочитаю не использовать базу данных, потому что каждый вариант (даже SQLite) является излишним для моего скромного требования (также - я хотел бы иметь возможность редактировать значения в автономном режиме простым способом, и ничего проще, чем блокнот).
Предположим, что мои данные выглядят следующим образом (в файле, который он разделяет запятыми без заголовков, это только иллюстрация):
Row | Name | Year | Priority
------------------------------------
1 | Cat | 1998 | 1
2 | Fish | 1998 | 2
3 | Dog | 1999 | 1
4 | Aardvark | 2000 | 1
5 | Wallaby | 2000 | 1
6 | Zebra | 2001 | 3
Примечания:
- Строка может быть "реальным" значением, записанным в файл, или просто автоматически сгенерированным значением, которое представляет номер строки. В любом случае он существует в памяти.
- Имена уникальны.
Что я делаю с данными:
- Поиск строки на основе идентификатора (итерации) или имени (прямого доступа).
- Отобразить таблицу в разных заказах на основе нескольких полей: мне нужно отсортировать ее, например. по приоритету, а затем по году или году, а затем по приоритету и т.д.
- Мне нужно подсчитывать экземпляры на основе наборов параметров, например. сколько строк имеет свой год между 1997 и 2002 годами или сколько строк в 1998 году, приоритет > 2 и т.д.
Я знаю это "крики" для SQL...
Я пытаюсь выяснить, какой лучший выбор для структуры данных. Ниже приведены несколько вариантов:
Список списков строк:
a = []
a.append( [1, "Cat", 1998, 1] )
a.append( [2, "Fish", 1998, 2] )
a.append( [3, "Dog", 1999, 1] )
...
Список списков столбцов (очевидно, будет API для add_row и т.д.):
a = []
a.append( [1, 2, 3, 4, 5, 6] )
a.append( ["Cat", "Fish", "Dog", "Aardvark", "Wallaby", "Zebra"] )
a.append( [1998, 1998, 1999, 2000, 2000, 2001] )
a.append( [1, 2, 1, 1, 1, 3] )
Словарь списков столбцов (константы могут быть созданы для замены строковых ключей):
a = {}
a['ID'] = [1, 2, 3, 4, 5, 6]
a['Name'] = ["Cat", "Fish", "Dog", "Aardvark", "Wallaby", "Zebra"]
a['Year'] = [1998, 1998, 1999, 2000, 2000, 2001]
a['Priority'] = [1, 2, 1, 1, 1, 3]
Словарь с ключами, являющимися кортежами (строка, поле):
Create constants to avoid string searching
NAME=1
YEAR=2
PRIORITY=3
a={}
a[(1, NAME)] = "Cat"
a[(1, YEAR)] = 1998
a[(1, PRIORITY)] = 1
a[(2, NAME)] = "Fish"
a[(2, YEAR)] = 1998
a[(2, PRIORITY)] = 2
...
И я уверен, что есть другие способы... Однако каждый способ имеет свои недостатки, когда речь идет о моих требованиях (сложный порядок и подсчет).
Какой рекомендуемый подход?
EDIT:
Чтобы прояснить, производительность для меня не является серьезной проблемой. Поскольку таблица настолько мала, я считаю, что почти каждая операция будет находиться в диапазоне миллисекунд, что не является проблемой для моего приложения.