从列表中删除类似项目的pythonic方法

duk*_*kem 3 python python-itertools

我有一个项目列表,我想从中删除所有类似的值,但第一个和最后一个.例如:

listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)
  1. 前三个元素"1,1,1"是相似的,所以删除中间的"1".
  2. 接下来的两个零是未修改的.
  3. 一个是一个.保持不变.
  4. 四个零.删除第一个和最后一个之间的项目.

导致:

listOut = [1, 1, 0, 0, 1, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)

在c ++中这样做的方式非常明显,但它看起来与python编码风格有很大不同.或者这是唯一的方法?

基本上,只需删除图中"y"值未更改的过多点: 在此输入图像描述

Mar*_*ers 6

用于itertools.groupby()对您的值进行分组:

from itertools import groupby

listOut = []
for value, group in groupby(listIn):
    listOut.append(next(group))
    for i in group:
        listOut.append(i)
        break
Run Code Online (Sandbox Code Playgroud)

或者,为了提高效率,作为发电机:

from itertools import groupby

def reduced(it):
    for value, group in groupby(it):
        yield next(group)
        for i in group:
            yield i
            break
Run Code Online (Sandbox Code Playgroud)

演示:

>>> listIn = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1]
>>> list(reduced(listIn))
[1, 1, 0, 0, 1, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)