Мій сценарій такий: у мене є таблиця даних (кілька полів, менше ста рядків), яку я широко використовую в своїй програмі. Мені також потрібні ці дані, щоб бути постійними, тому я зберігаю їх як 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
...
І я впевнений, що є й інші способи ... Однак кожен із способів має недоліки, коли справа стосується моїх вимог (складне впорядкування та підрахунок).
Який рекомендований підхід?
РЕДАГУВАТИ:
Щоб пояснити, продуктивність для мене не є основною проблемою. Оскільки таблиця настільки мала, я вважаю, що майже кожна операція буде знаходитися в діапазоні мілісекунд, що не турбує мою програму.