首页 > 解决方案 > 从列表中删除最后一次出现的包含子字符串的元素

问题描述

所以说我有,list1 = ['the dog', 'the cat', 'cat dog', 'the dog ran home']

和 sub_string = '狗'

我怎样才能返回 list2 = ['the dog', 'the cat', 'cat dog']

即,返回一个删除了最后一次出现的子字符串的列表?

标签: pythonpython-2.7string-search

解决方案


在这里没有内置函数对您有很大帮助,因为扫描 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新副本list2list2 = list1[:]

在这两种情况下,您都可以通过在;上放置一个else:块来检测是否找到了一个项目。for如果else块触发,你没有break,因为sub_string在任何地方都找不到。


推荐阅读