如何用Python优雅实现类似rstrip()的列表末尾元素移除功能?
有没有Pythonic的优雅方式实现类似rstrip()的列表操作?
假设我们有以下不同列表:
l1 = ['A', 'D', 'D'] l2 = ['A', 'D'] l3 = ['D', 'A', 'D', 'D'] l4 = ['A', 'D', 'B', 'D']
需要一个函数移除列表末尾所有指定元素(如'D'),但不能移除位于其他元素之前或中间的该元素!
执行如下测试代码:
for mylist in [l1, l2, l3, l4]: print(mylist, ' => ', remove_end_elements(mylist, 'D'))
期望输出为:
['A', 'D', 'D'] => ['A'] ['A', 'D'] => ['A'] ['D', 'A', 'D', 'D'] => ['D', 'A'] ['A', 'D', 'B', 'D'] => ['A','D','B']
现有一种可行实现:
def remove_end_elements(mylist, myelement): counter = 0 for element in mylist[::-1]: if element != myelement: break counter -= 1 return mylist[:counter]
请问是否有更优雅、高效的实现方式?
针对需求补充说明:
- 返回新列表或修改原列表均可(上述实现以创建新列表为目标)。
- 实际场景中的列表包含多字符字符串(来自文本文件的行)。
- 实际需要移除的是符合“空行”标准的行(无字符、仅含空白字符、仅含空白字符与逗号),该判断逻辑已单独实现。
- 列表末尾的空行数量不定,但大多数情况下为1行。
基于接近实际场景的模拟数据与实际使用的is_empty_line()函数,对目前提供的多种方案进行了计时测试:
- Kelly Bundy的方案: 0.029670200019609183
- Guy的方案: 0.038380099984351546
- 原实现方案: 0.03837349999230355
- cards的方案: 0.0408437000005506
- Timeless的方案: 0.08083210000768304
方案的性能表现似乎与is_empty_line()函数的复杂度相关(Timeless的方案始终最慢,Kelly Bundy的方案始终最快)。
内容的提问来源于Stack Exchange,提问作者CodingCat
相关产品推荐
相关产品推荐

