Python - упорядоченный список словарей с ограничением размера? - PullRequest
0 голосов
/ 22 декабря 2018

Это требование для проекта приложения чата, который я создаю с помощью Python, Flask, Socketio и Javascript:

"Просмотр сообщений: после выбора канала пользователь должен видеть любые сообщения, которыев этом канале уже было отправлено до 100 сообщений. Ваше приложение должно хранить только 100 самых последних сообщений на канал в серверной памяти. "

Итак, что я должен делатьсоздает список словарей.Как это:

messages = [ {"user":"Dave", "message":"Hello", "time":"12-24-2018"}, {"user":"John", "message":"Test", "time":"12-21-2018"} ]

Мои вопросы ..

  1. Как мне добавить / получить доступ к списку словарей, подобных этому?
  2. Как ограничитьразмер списка и заменить самый старый элемент вторым самым старым элементом, как я добавляю к нему?
  3. Это лучший метод для хранения фиксированного размера на стороне сервера данных?

1 Ответ

0 голосов
/ 23 декабря 2018

Одним из возможных решений является использование двусторонней очереди, реализованной в стандартной библиотеке collection package - collections.deque.

Запросы аналогичны спискам,но поддерживают эффективное добавление и выталкивание с обоих концов, являются поточно-ориентированными и могут иметь максимальную длину.

Например:

>>> dq = collections.deque(maxlen=5)
>>> for i, x in enumerate('abcde'):
...    dq.append({x: i})
... 
>>> dq
deque([{'a': 0}, {'b': 1}, {'c': 2}, {'d': 3}, {'e': 4}], maxlen=5)

Если вы добавляете элемент в деку, который maxlen установлен, и который уже имеет максимальный размер, элемент удален с другого конца deque:

>>> dq.append({'f': 5})
>>> dq
deque([{'b': 1}, {'c': 2}, {'d': 3}, {'e': 4}, {'f': 5}], maxlen=5)

>>> dq.appendleft({'z': 25})   
>>> dq
deque([{'z': 25}, {'b': 1}, {'c': 2}, {'d': 3}, {'e': 4}], maxlen=5)

Стоит отметить, что json-модуль Python не обрабатываетdeques, поэтому, если вы хотите вывести deque в json, вам нужно предоставить функцию, которая преобразует deque в список:

>>> json.dumps(dq)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ...
TypeError: Object of type deque is not JSON serializable
>>> def jdq(o):
...     return list(o)
... 
>>> json.dumps(dq, default=jdq)
'[{"z": 25}, {"b": 1}, {"c": 2}, {"d": 3}, {"e": 4}]'

Чтобы воссоздать deque из массива json, просто передайте десериализованныйсписок к новой деке:

>>> L = json.loads('[{"z": 25}, {"b": 1}, {"c": 2}, {"d": 3}, {"e": 4}]')
>>> dq = collections.deque(L, maxlen=5)
>>> dq
deque([{'z': 25}, {'b': 1}, {'c': 2}, {'d': 3}, {'e': 4}], maxlen=5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...