【问题标题】:Python Datatype for a fixed-length FIFO固定长度 FIFO 的 Python 数据类型
【发布时间】:2021-08-09 20:52:35
【问题描述】:

我想知道 Python 中是否存在类似于固定长度 FIFO 缓冲区的本机数据类型。例如,我想创建一个长度为 5 的 FIFO 缓冲区,该缓冲区初始化为全零。然后,它可能看起来像这样:

[0,0,0,0,0]

然后,当我在对象上调用 put 函数时,它将移出最后一个零并将新值(例如 1)放入左侧:

[1,0,0,0,0]

如果我输入一个 2,它就会移动并变成这样:

[2,1,0,0,0]

...等等。新值在前面,最旧的值被移开。我知道这很容易自己实现,但如果可能的话,我想使用本机 python 数据类型。有谁知道哪种数据类型最适合这个?

【问题讨论】:

    标签: python


    【解决方案1】:
    x = collections.deque(5*[0], 5)
    

    有关collections.deque的更多信息,请参阅the docs;您调用push 的方法实际上在该类型中称为appendleft。

    在 Python 2.6 中添加了第二个参数(maxlen,给出了最大长度);如果您使用的是旧版本的 Python,它将不可用。

    【讨论】:

      【解决方案2】:

      你也可以使用列表

      a = [0,0,0,0,0]
      
      a.pop(0)
      a.append(1)
      
      print a
      result [0,0,0,0,1]
      

      或左进右出,否则

      a.pop(5)
      a.insert(0,1)
      print a
      result [1,0,0,0,0]
      

      【讨论】:

      • -1 不建议这样做。为什么阅读文档docs.python.org/library/…
      • @toom 不建议这样做,您只需要注意使用列表的惩罚。为简单起见,列表很难被击败。
      • 这是一个糟糕的解决方案。我使用具有固定数量元素和索引计数器的列表来实现它。
      • -1 第一个示例不是 FIFO,而是 LIFO。第二个例子它确实是一个先进先出,虽然它是一个非常慢且不推荐的例子。 collections.deque 的速度要快得多, appendleft 的复杂度为 O(1),而不是复杂度等于列表长度的 list.seek(0,1)。
      【解决方案3】:

      这篇文章再举一个例子

      from collections import deque
      
      domains = ['1.com','2.com','3.com']
      d = deque(domains)               
      d.pop() #pop(delete) 3.com here
      d.appendleft('new.com') 
      
      
      print d
      

      结果:

      deque(['new.com', '1.com', '2.com'])
      

      【讨论】:

      • 为什么你使用 pop 而不是 maxlen ?
      • 这不是本例中发生的情况,但您可能希望捕获掉出缓冲区的项目。为此,请使用 pop:fell_off = d.pop(); d.appendleft(new).
      【解决方案4】:
      
      test_queue = deque([0]*5,maxlen=5) 
      
      for i in range(10):
          print(i)
          test_queue.appendleft(i)
          print(list(test_queue))
      

      打印:

      [0, 0, 0, 0, 0]
      1
      [1, 0, 0, 0, 0]
      2
      [2, 1, 0, 0, 0]
      3
      [3, 2, 1, 0, 0]
      4
      [4, 3, 2, 1, 0]
      5
      [5, 4, 3, 2, 1]
      6
      [6, 5, 4, 3, 2]
      7
      [7, 6, 5, 4, 3]
      8
      [8, 7, 6, 5, 4]
      9
      [9, 8, 7, 6, 5]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2012-11-12
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 2016-05-14
        • 2012-10-12
        相关资源
        最近更新 更多