删除列表中具有连续重复项的元素

输入:[1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
 输出:[1, 2, 3, 4, 5, 1, 2]

方法1:循环遍历

a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
i = 0

while i < len(a)-1:
    if a[i] == a[i+1]:
        del a[i]
    else:
        i = i+1    
print(a)

方法2:使用 itertools 中的 groupby
其实 groupby 就是对可迭代对象的批量操作(可迭代对象就是像 list、dict、迭代器等这种可以用 for 循环遍历的数据结构或者对象)。groupby() 的作用就是把可迭代对象中相邻的重复元素挑出来放一起。

a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
from itertools import groupby
print([x[0] for x in groupby(a)])

也可以引入 operator 中的 itemgetter:获取对象的哪些维的数据,参数为序号(即需要获取的数据在对象中的序号)。然后配合 map 使用。

a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
from itertools import groupby
from operator import itemgetter
print( list(map(itemgetter(0), groupby(a))) )

方法3:使用 enumerate
enumerate() 是 python 的内置函数。enumerate 在字典上是枚举、列举的意思。对于一个可迭代的(iterable) / 可遍历的对象(如列表、字符串),enumerate 将其组成一个索引序列,利用它可以同时获得索引和值。

a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
print( [v for i, v in enumerate(a) if i == 0 or v != a[i-1]] )
a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
L = a + [999]
print( [v for i, v in enumerate(L) if v != L[i - 1]][:-1] )

方法4:使用海象运算符
海象运算符的语法格式是一个变量名后跟一个表达式或者一个值,这个和赋值运算符 = 类似,可以看作是一种新的赋值运算符。它可以把表达式的一部分赋值给变量。

(variable_name := expression or value)
a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
prev = object()
print( [prev := v for v in a if prev != v] )

方法5:使用 zip_longest
zip_longest 具体可以用来对列表的一一对应,如果列表的长度不一致,则其会选择最长的那个列表,并将没有的填充为 None。

from itertools import zip_longest
list1 = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
res = [i for i, j in zip_longest(list1, list1[1:]) if i != j]
print(res)

方法6:使用 list.pop(index)
index 为可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。

a = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
for x in a[:-1]:
    next_index = a.index(x) + 1
    if a[next_index] == x:
        a.pop(next_index)
print(a)

方法7:使用 reduce

reduce(function, sequence[, initial]) -> value

reduce 函数接受一个 function 和一串 sequence,并返回单一的值,以如下方式计算:

  1. 初始,function 被调用,并传入 sequence 的前两个 items,计算得到 result 并返回。
  2. function 继续被调用,并传入上一步中的 result,和 sequence 中下一个 item,计算得到 result 并返回。一直重复这个操作,直到 sequence 都被遍历完,返回最终结果。

注意:
①当 initial 值被指定时,传入步骤1中的两个参数分别是 initial 值和 sequence 的第一个 items。reduce() 最多只能接受三个参数,func,sequence,initial。
②在 python2 中 reduce 是内置函数,但是在 python3 中,它被移到 functools 模块,因此使用之前需要导入。

my_list = [1, 1, 1, 1, 1, 1, 2, 3, 4, 4, 5, 1, 2]
from functools import reduce
list1 = reduce(lambda a, b: a if a[-1:] == [b] else a + [b], my_list, [])
print(list1)

参考:https://cloud.tencent.com/developer/ask/sof/41108