删除列表中以特定事物开头的后面的字符串 python

remove later strings starting with a certain thing in a list python

我有一个这样的列表:

['a b d', 'a b e', 'c d j', 'w x y', 'w x z', 'w x k']

我想删除以与其相同的 4 个字符开头的字符串之后出现的所有字符串。例如,'a b e' 将被删除,因为 'a b d' 出现在它之前。

新列表应如下所示:

['a b d', 'c d j', 'w x y']

我该怎么做?

(注意:列表已排序,根据@Martijn Pieters 的评论)

使用生成器函数来记住开始:

def remove_starts(lst):
    seen = []
    for elem in lst:
        if elem.startswith(tuple(seen)):
            continue
        yield elem
        seen.append(elem[:4])

因此该函数会跳过任何以 seen 中的一个字符串开头的任何内容,将它允许通过的任何内容的前 4 个字符添加到该集合。

演示:

>>> lst = ['a b d', 'a b e', 'c d j', 'w x y', 'w x z', 'w x k']
>>> def remove_starts(lst):
...     seen = []
...     for elem in lst:
...         if elem.startswith(tuple(seen)):
...             continue
...         yield elem
...         seen.append(elem[:4])
...
>>> list(remove_starts(lst))
['a b d', 'c d j', 'w x y']

如果您的输入已排序,这可以简化为:

def remove_starts(lst):
    seen = ()
    for elem in lst:
        if elem.startswith(seen):
            continue
        yield elem
        seen = elem[:4]

这通过限制到最后一个来节省前缀测试。

您也可以使用 OrderedDict,键可以是前四个字符,其中值将是包含这四个字符的第一个字符串:

lst = ['a b d', 'a b e', 'c d j', 'w x y', 'w x z', 'w x k']

from collections import OrderedDict

print(list(OrderedDict((s[:4], s) for s in lst).values()))
['a b e', 'c d j', 'w x k']