从 Python 列表中删除某些最终值

Cod*_*Cat 5 python list

有没有一种优雅的 Pythonic 方式来执行类似rstrip()列表的操作?

想象一下,我有不同的列表:

l1 = ['A', 'D', 'D']
l2 = ['A', 'D']
l3 = ['D', 'A', 'D', 'D']
l4 = ['A', 'D', 'B', 'D']
Run Code Online (Sandbox Code Playgroud)

我需要一个函数来从给定列表中删除所有最终存在的 'D'元素(但不是那些位于其他元素之前或之间的元素!)。

for mylist in [l1, l2, l3, l4]:
    print(mylist, ' => ', remove_end_elements(mylist, 'D'))
Run Code Online (Sandbox Code Playgroud)

所以期望的输出是:

['A', 'D', 'D'] => ['A']
['A', 'D'] => ['A']
['D', 'A', 'D', 'D'] => ['D', 'A']
['A', 'D', 'B', 'D'] => ['A','D','B']
Run Code Online (Sandbox Code Playgroud)

完成这项工作的一种实现是这样的:

def remove_end_elements(mylist, myelement):
    counter = 0
    for element in mylist[::-1]:
        if element != myelement:
            break
        counter -= 1

    return mylist[:counter]
Run Code Online (Sandbox Code Playgroud)

有没有更优雅/更有效的方法来做到这一点?

回答评论问题:

  • 一个新列表或修改原始列表都可以(尽管上面的实现考虑了创建一个新列表)。
  • 真实列表包含多字符字符串(文本文件中的行)。
  • 我实际上想要删除的是满足“空”某些标准的行(没有字符或只有空格或只有空格和逗号)。我在其他地方实施了该检查。
  • 这些空行可以是列表末尾的任意数字,但在大多数情况下为 1。

我对迄今为止提供的不同解决方案进行了计时,模拟数据接近我的实际用例,以及我正在使用的实际 is_empty_line() 函数:

哪一个性能更好似乎确实取决于is_empty_line()函数的复杂性(Timeless 的解决方案除外,它始终比其他解决方案慢,而 KellyBundy 的解决方案则始终更快)。

Kel*_*ndy 1

def remove_end_elements(mylist, myelement):
    while myelement in mylist[-1:]:
        mylist.pop()
    return mylist
Run Code Online (Sandbox Code Playgroud)