我的问题是similar to this,但我不想删除完整的重复项,而是想从python的列表中删除连续的部分“重复项”。
对于我的特定用例,我希望从列表中删除以相同字符开始的单词,并且希望能够定义该字符。在此示例中,它是#
,所以
['#python', 'is', '#great', 'for', 'handling',
'text', '#python', '#text', '#nonsense', '#morenonsense', '.']
应该成为
['#python', 'is', '#great', 'for', 'handling', 'text', '.']
答案 0 :(得分:5)
您可以使用itertools.groupby
:
>>> from itertools import groupby
>>> lst = ['#python', 'is', '#great', 'for', 'handling', 'text', '#python', '#text', '#nonsense', '#morenonsense', '.']
>>> [s for k, g in ((k, list(g)) for k, g in groupby(lst, key=lambda s: s.startswith("#")))
... if not k or len(g) == 1 for s in g]
...
['#python', 'is', '#great', 'for', 'handling', 'text', '.']
这根据元素是否以#
进行分组,然后仅使用没有元素的元素,或仅使用单个元素的元素。
答案 1 :(得分:3)
这是使用itertools.groupby
的一种解决方案。想法是根据第一个字符是否等于给定的k
对项目进行分组。然后应用您的2条标准;如果他们不满意,则可以生产这些物品。
L = ['#python', 'is', '#great', 'for', 'handling', 'text',
'#python', '#text', '#nonsense', '#morenonsense', '.']
from itertools import chain, groupby
def list_filter(L, k):
grouper = groupby(L, key=lambda x: x[0]==k)
for i, j in grouper:
items = list(j)
if not (i and len(items) > 1):
yield from items
res = list_filter(L, '#')
print(list(res))
['#python', 'is', '#great', 'for', 'handling', 'text', '.']
答案 2 :(得分:1)
一个简单的迭代就足够了,只要您保留一些上下文即可:前一个元素以及是否保留前一个上一个。
def filter_lst(lst, char):
res = [] # the future returned value
keep = True # initialize context
old = lst[0]
for word in lst[1:]: # and iterate (first element is already in old)
if old[0] != char or (keep and word[0] != char):
res.append(old)
keep = True
else:
keep = False
old = word
if keep or (old[0] != char): # don't forget last element!
res.append(old)
return res
它给出:
>>> lst = ['#python', 'is', '#great', 'for', 'handling',
'text', '#python', '#text', '#nonsense', '#morenonsense', '.']
>>> filter_lst(lst, '#')
['#python', 'is', '#great', 'for', 'handling', 'text', '.']