Python Словарь ключ и структура вопроса - PullRequest
0 голосов
/ 29 апреля 2020

Новичок в Python, обращающийся к профессионалам за помощью. Я строю python программу, которая сравнивает две текстовые базы данных. Я разбил отдельные таблицы на словари, и теперь я пытаюсь решить, какие элементы в таблице должны быть частью самого высокого уровня ключа, чтобы я мог легко фильтровать, минимизировать время выполнения, циклы и т. Д. c. Вот моя стартовая структура, но я не продан на этом.

pfcompare.Buses1

{'10000"Bus Name 1"46.0000': {'name': 'Bus Name 1', 'kv': 46.0, 'index': 2671, 'type': 1, 'vsched': 1.0, 'area': 10, 'zone': 105, 'vmax': 1.05, 'vmin': 0.95, 'owner': 129, 'subnumber': -1, 'subname': '" "', 'BA': 27}} 

Так что лучше было бы изменить это, чтобы сказать это:

{'10000"Bus Name 1"46.0000', 10, 105: {'name': 'Bus Name 1', 'kv': 46.0, 'index': 2671, 'type': 1, 'vsched': 1.0, 'area': 10, 'zone': 105, 'vmax': 1.05, 'vmin': 0.95, 'owner': 129, 'subnumber': -1, 'subname': '" "', 'BA': 27}}

Где, если я планирую фильтровать по области и зоне (в этом примере area = 10 и zone = 105) На высшем уровне ключей это скорость сортировки или фильтрации записей? Я спрашиваю, потому что мне кажется, что, как у меня сейчас, мне нужно было бы иметь ключи от oop до '10000 "Bus Name 1" 46.0000', чтобы увидеть, является ли это зона 10 зоны 105? Поправьте или я что-то упустил. Вся помощь будет оценена. Я просто чувствую, что структура может сделать мою жизнь легкой в ​​этой программе или несчастной! Спасибо вам всем.

1 Ответ

0 голосов
/ 02 мая 2020

Прежде всего, если вы хотите использовать кортеж в качестве ключа, используйте круглые скобки:

{('10000"Bus Name 1"46.0000', 10, 105): {...}}

Во-вторых, вы не решаетесь поместить некоторую информацию в основной ключ, как указано выше, чтобы избежать включения oop в внутренние ключи. Но это не то, как словари реализованы. На большинстве языков словарями являются га sh таблиц . Существует много реализаций, но основной принцип:

  • использует функцию, которая отображает ключи в int (hash)
  • , хранит пары key, value в массив с индексом в зависимости от hash (например, hash % len(array))
  • найти способ разрешения коллизий (разные ключи, имеющие одинаковые hash)

Обычно есть столкновений мало, поэтому поиск выполняется за постоянное время (амортизируется O(1)) и не требует al oop (O(n), где n - количество key, value пар). В основном, это быстро и не зависит от размера диктата.

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


У вас есть другая проблема: как найти данные, соответствующие '10000"Bus Name 1"46.0000', если вы не знаете область и зону? И если вам не нужен прямой поиск, просто используйте список одноуровневых диктов и забудьте о двухуровневых диктах:

[{id: '10000"Bus Name 1"46.0000', 'name': 'Bus Name 1', 'kv': 46.0, ... }, {id: ... }, {id: ... }]

Если вам нужно найти данные по id или по области или по Зона, вы могли бы создать вспомогательные дикты для отображения zone -> set of id having that zone или area -> set of id having that area.


И если вам нужно выбрать данные по конкретным c комбинациям ключ / значение, сортировать, объединять, ... , может быть, вам стоит взглянуть на Pandas или на базу данных вроде sqlite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...