我有一个这样的清单:
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的评论对列表进行排序)
答案 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']