这是一个基于的版本卡尔的回答 https://stackoverflow.com/questions/7641955/elegant-way-to-remove-contiguous-repeated-elements-in-a-list/7642017#7642017这不需要列表的副本(tmp
、切片和压缩列表)。izip
比 (Python 2) 快得多zip
对于大型列表。chain
比切片稍慢,但不需要tmp
对象或列表的副本。islice
再加上做一个tmp
速度快一点,但需要更多内存,而且不太优雅。
from itertools import izip, chain
[y for x, y, z in izip(chain((None, None), li),
chain((None,), li),
li) if x != y != z]
A timeit
测试表明它的速度大约是卡尔的答案或我最快的速度的两倍groupby
适合短期团体的版本。
确保使用除None
(like object()
)如果您的列表可以包含None
s.
如果您需要它来处理不是序列的迭代器/可迭代对象,或者您的组很长,请使用此版本:
[key for key, group in groupby(li)
if (next(group) or True) and next(group, None) is None]
timeit
显示对于 1,000 个项目组,它比其他版本快大约十倍。
早期、缓慢的版本:
[key for key, group in groupby(li) if sum(1 for i in group) == 1]
[key for key, group in groupby(li) if len(tuple(group)) == 1]