删除列表中以特定事物开头的后面的字符串 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']
我有一个这样的列表:
['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']