【问题标题】:Python - Ordered List of Dictionaries, With a Size Limit?Python - 字典的有序列表,有大小限制?
【发布时间】:2018-12-22 01:39:50
【问题描述】:

这是我使用 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. 这是存储固定大小数据服务器端的最佳做法吗?

【问题讨论】:

  • 您需要使用threading.Locklist.appendlist.pop。需求似乎推断你只是将这个列表存储在内存中,所以我不明白你的第三点
  • 1.附加到字典列表很简单。创建一个新的单条消息字典,如msg = {"user":"Dave", "message":"Hello", "time":"12-24-2018"},然后messages.append(msg) 将消息添加到列表中。 2.限制列表大小:将消息列表切片为:messages = messages[-100:] 3.这点不清楚,能多解释一下吗?

标签: javascript python flask socket.io


【解决方案1】:

一种可能的解决方案是使用标准库的collections 包中实现的双端队列 - 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 并且已经达到最大尺寸的双端队列中,则从双端队列的另一端删除一个元素:

>>> 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)

值得注意的是,Python 的 json 模块不处理双端队列,因此如果要将双端队列转储为 json,则需要提供一个将双端队列转换为列表的函数:

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

要从 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多