python - 从列表中删除最后一次出现的包含子字符串的元素
问题描述
所以说我有,list1 = ['the dog', 'the cat', 'cat dog', 'the dog ran home']
和 sub_string = '狗'
我怎样才能返回 list2 = ['the dog', 'the cat', 'cat dog']
即,返回一个删除了最后一次出现的子字符串的列表?
解决方案
在这里没有内置函数对您有很大帮助,因为扫描 a 中的子字符串list
不是受支持的功能,并且以相反的顺序执行此操作会加倍困难。列表推导也不会起到太大作用,因为让它们有足够的状态来识别您何时发现您的针将涉及向列表推导添加副作用,这使得它变得神秘并违反了函数式编程工具的目的。所以你被困在自己的循环中:
list2 = []
list1iter = reversed(list1) # Make a reverse iterator over list1
for item in list1iter:
if sub_string in item: # Found item to remove, don't append it, we're done
break
list2.append(item) # Haven't found it yet, keep item
list2.extend(list1iter) # Pull all items after removed item
list2.reverse() # Put result back in forward order
另一种方法是按索引扫描,允许您这样del
做;如果您想list1
就地修改而不是制作新的,这可能是一个更好的解决方案list
:
for i, item in enumerate(reversed(list1), 1):
if sub_string in item:
del list1[-i]
break
该解决方案适用于通过简单地更改对 to 的所有引用并在循环之前添加来制作list1
新副本list2
。list2 = list1[:]
在这两种情况下,您都可以通过在;上放置一个else:
块来检测是否找到了一个项目。for
如果else
块触发,你没有break
,因为sub_string
在任何地方都找不到。