删除Python中具有连续部分重复项的元素

时间:2018-07-17 11:29:41

标签: python list duplicates

我的问题是similar to this,但我不想删除完整的重复项,而是想从python的列表中删除连续的部分“重复项”。

对于我的特定用例,我希望从列表中删除以相同字符开始的单词,并且希望能够定义该字符。在此示例中,它是#,所以

['#python', 'is', '#great', 'for', 'handling', 
'text', '#python', '#text', '#nonsense', '#morenonsense', '.']

应该成为

['#python', 'is', '#great', 'for', 'handling', 'text', '.']

3 个答案:

答案 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', '.']