从列表python中的某个东西开始删除后面的字符串

时间:2015-12-12 23:24:26

标签: python string list startswith

我有一个这样的清单:

E/chromium: [ERROR:gles2_cmd_decoder.cc(5942)] [.Compositor-Onscreen-0xb8bb47f8]GL ERROR :GL_INVALID_OPERATION : glUseProgram: program not linked

E/chromium: [ERROR:gles2_cmd_decoder.cc(5718)] [.Compositor-Onscreen-0xb8bb47f8]GL ERROR :GL_INVALID_OPERATION : glUniformMatrix4fv: wrong uniform function for type

我想删除在以与它相同的4个字符开头的字符串之后出现的所有字符串。例如,['a b d', 'a b e', 'c d j', 'w x y', 'w x z', 'w x k'] 将被删除,因为'a b e'发生在它之前。

新列表应如下所示:

'a b d'

我该怎么做?

(注意:根据@Martijn Pieters的评论对列表进行排序)

2 个答案:

答案 0 :(得分:6)

使用生成器功能记住开始:

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]

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

答案 1 :(得分:2)

您也可以使用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']