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

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

问题描述:

如何在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

你是什么意思的崩溃? – neverendingqs

+5

看看'itertools.groupby' – MaxU

+0

你在问一个工具或实现吗?如果你想自己编写它,你可以遍历并保留任何不匹配元素的元素。 –

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.

+0

它工作得很好,但有了这样一个列表[4,4,4,4,2,2,3,3,3,3,3,3],我想结果是[4,2,3 ,3]而不是[4,2,3]。你能指导我解决这个问题吗? – Elmahy

+0

@ahmedmar为什么会有'[4,2,3,3]'? '[4,2,3]'在这种情况下是正确的输出。你想删除重复的东西,而且两者之间没有任何关系。 – Bharel

+0

有没有办法指定itertools的限制来按它对列表进行分组。即我希望每3,3,3为3,每4,4,4,4为4? – Elmahy

您可能需要这样的东西。

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。

+0

可能更好地构建新列表,因为从for循环中的列表中删除项目可能会导致问题 –

+0

我们这样做。我们正在遍历列表的一个切片副本,而不是原始列表。因此,在我们迭代的时候,不会因为删除而导致自己被删除。 –

+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    
+1

尽管此代码可能会回答问题,但提供有关此代码为何和/或如何回答此问题的其他上下文可提高其长期价值。不鼓励使用仅有代码的答案。 – Ajean

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

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) 

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:]) 
+0

虽然这段代码可能会回答这个问题,但提供关于此代码为什么和/或如何回答问题的其他上下文会提高其长期价值。不鼓励使用仅有代码的答案。 – Ajean

检查下一个元素总是不等于项目。如果这样追加。

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 

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. 从主列表(列表1)获取的每个项目。
  2. 如果'temp_list'为空,请添加该项目。
  3. 如果不是,请检查temp_list中的最后一项是否为 ,与我们从“list1”中取出的项目是否相同。
  4. 如果项目不同,则追加到temp_list中。