如何从列表中删除连续重复项?

时间:2016-08-30 21:27:54

标签: python duplicates

如何在python中删除像这样的列表中的连续重复项?

lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]

拥有唯一的列表或集合不会解决问题,因为在上一个列表中有一些重复的值,如1,...,1。

我希望结果如下:

newlst = [1,2,4,1,3,5]

当我有这样的清单时,你也会考虑这个案例  [4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3] 我希望结果为[4,2,3,3] 而不是[4,2,3]

7 个答案:

答案 0 :(得分:10)

itertools.groupby()是您的解决方案。

newlst = [k for k, g in itertools.groupby(lst)]

如果您希望按照项目的值对组大小进行分组和限制,则意味着8 4将是[4,4],而9 3将是[3,3] ,3]这里有2个选项:

import itertools

def special_groupby(iterable):
    last_element = 0
    count = 0
    state = False
    def key_func(x):
        nonlocal last_element
        nonlocal count
        nonlocal state
        if last_element != x or x >= count:
            last_element = x
            count = 1
            state = not state
        else:
            count += 1
        return state
    return [next(g) for k, g in itertools.groupby(iterable, key=key_func)]

special_groupby(lst)

OR

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

newlst = list(itertools.chain.from_iterable(next(zip(*grouper(g, k))) for k, g in itertools.groupby(lst)))

选择您认为合适的任何一种。两种方法都用于数字> 0

答案 1 :(得分:2)

如果您想使用@MaxU建议的itertools方法,可能的代码实现是:

import itertools as it

lst=[1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]

unique_lst = [i[0] for i in it.groupby(lst)]

print(unique_lst)

答案 2 :(得分:2)

list1 = ['a', 'a', 'a', 'b', 'b' , 'a', 'f', 'c', 'a','a']
temp_list = []


for item in list1:   
   if len(temp_list) == 0:
      temp_list.append(item)

   elif len(temp_list) > 0:
      if  temp_list[-1] != item:
          temp_list.append(item)

print(temp_list)
  1. 从主列表中获取每个项目(list1)。
  2. 如果'temp_list'为空,请添加该项目。
  3. 如果没有,请检查temp_list中的最后一项是否为 与我们从'list1'获取的项目不同。
  4. 如果项目不同,则附加到temp_list。

答案 3 :(得分:0)

你可能想要这样的东西。

lst = [1, 1, 2, 2, 2, 2, 3, 3, 4, 1, 2]
prev_value = None
for number in lst[:]: # the : means we're slicing it, making a copy in other words
    if number == prev_value:
        lst.remove(number)
    else:
        prev_value = number

因此,我们正在浏览列表,如果它与之前的号码相同,我们会将其从列表中删除,否则,我们会更新之前的号码。

可能有一种更简洁的方式,但这是对我来说最明显的方式。

HTH。

答案 4 :(得分:0)

newlist=[]    
prev=lst[0]
newlist.append(prev)
    for each in lst[:1]: #to skip 1st lst[0]
        if(each!=prev):
            newlist.append(each)  
         prev=each             

答案 5 :(得分:0)

st = ['']
[st.append(a) for a in [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] if a != st[-1]]
print(st[1:])

答案 6 :(得分:0)

检查下一个元素是否始终不等于item。如果这样追加。

lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]

new_item = lst[0]
new_list = [lst[0]]
for l in lst:
   if new_item != l:
     new_list.append(l)
     new_item = l

print new_list
print lst