保留最后 N 个元素

问题

在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录?

解决方案

保留有限历史记录正是 collections.deque 大显身手的时候。
使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉。

>>> q = deque(maxlen=3)
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3], maxlen=3)
>>> q.append(4)
>>> q
deque([2, 3, 4], maxlen=3)
>>> q.append(5)
>>> q
deque([3, 4, 5], maxlen=3)

尽管你也可以手动在一个列表上实现这一的操作(比如增加、删除等等)。但是这里的队列方案会更加优雅并且运行得更快些。更一般的, deque 类可以被用在任何你只需要一个简单队列数据结构的场合。如果你不设置最大队列大小,那么就会得到一个无限大小队列,你可以在队列的两端执行添加和弹出元素的操作。

>>> q = deque()
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3])
>>> q.appendleft(4)
>>> q
deque([4, 1, 2, 3])
>>> q.pop()
3
>>> q
deque([4, 1, 2])

在队列两端插入或删除元素时间复杂度都是 O(1) ,而在列表的开头插入或删除元素的时间复杂度为 O(N) 。

在编程中,数组操作是一项基础且重要的技能,尤其是在处理数据集时。当需要从数组中删除最后几个元素时,不同的编程语言提供了多种方法。以下是一些常见编程语言中实现这一功能的方法。 ### JavaScript 在 JavaScript 中,可以通过修改数组的 `length` 属性来快速删除数组末尾的元素。例如,如果有一个数组 `arr`,并且想要保留前 `n` 个元素,可以这样做: ```javascript arr.length = n; ``` 这种方法简单高效,适用于大多数现代浏览器和 Node.js 环境。 ### Python Python 中的列表(list)支持切片操作,这使得删除列表末尾的元素变得非常简单。假设有一个列表 `lst`,并且希望保留前 `n` 个元素,可以使用如下代码: ```python lst = lst[:n] ``` 此方法利用了 Python 的切片特性,创建了一个包含原列表前 `n` 个元素的新列表,并将原列表重新指向这个新列表。 ### PHP PHP 提供了 `array_splice()` 函数,不仅可以删除数组中的元素,还可以替换被删除元素的位置。若要删除数组末尾的若干元素,可以使用负数作为偏移量: ```php array_splice($array, -count); ``` 这里,`$array` 是要修改的数组,而 `count` 表示要删除的元素数量。此操作会直接修改原数组。 ### Java Java 中的数组长度是固定的,因此要删除数组末尾的元素,通常需要创建一个新的数组,并将原数组中除末尾几个元素外的所有元素复制进去。例如,要保留前 `n` 个元素: ```java int[] newArray = Arrays.copyOfRange(originalArray, 0, n); ``` 这里,`originalArray` 是原始数组,`n` 是新数组的长度。`Arrays.copyOfRange` 方法来自 `java.util.Arrays` 类,用于创建数组的副本。 ### C++ 在 C++ 中,如果使用的是标准库中的 `std::vector` 容器,可以通过调用 `pop_back()` 方法多次来删除末尾的元素,或者使用 `erase()` 方法一次性删除多个元素: ```cpp // 删除最后一个元素 vec.pop_back(); // 删除最后三个元素 vec.erase(vec.end() - 3, vec.end()); ``` 这里,`vec` 是一个 `std::vector` 实例。`pop_back()` 方法用于删除最后一个元素,而 `erase()` 方法则允许删除指定范围内的所有元素。 ### 相关问题 1. 如何在 JavaScript 中删除数组中的特定元素? 2. Python 中有哪些方法可以高效地处理数组? 3. PHP 中除了 array_splice() 还有什么方法可以删除数组元素? 4. Java 中如何处理数组大小固定的问题? 5. C++ 标准库中 vector 容器提供了哪些方便的数组操作方法?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值