有没有一种优雅的 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)
有没有更优雅/更有效的方法来做到这一点?
回答评论问题:
我对迄今为止提供的不同解决方案进行了计时,模拟数据接近我的实际用例,以及我正在使用的实际 is_empty_line() 函数:
哪一个性能更好似乎确实取决于is_empty_line()函数的复杂性(Timeless 的解决方案除外,它始终比其他解决方案慢,而 KellyBundy 的解决方案则始终更快)。
def remove_end_elements(mylist, myelement):
while myelement in mylist[-1:]:
mylist.pop()
return mylist
Run Code Online (Sandbox Code Playgroud)