Elegant way to remove contiguous repeated elements in a list(删除列表中连续重复元素的巧妙方法)
本文介绍了删除列表中连续重复元素的巧妙方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在寻找一种干净、高尚的方式从下面的列表中剔除:
li = [0, 1, 2, 3, 3, 4, 3, 2, 2, 2, 1, 0, 0]
所有连续的重复元素(超过一个数字),以获取:
re = [0, 1, 2, 4, 3, 1]
但是,尽管我有可用的代码,但它给人的感觉不是毕达哥拉斯式的,而且我确信一定有解决办法(也许是一些不太为人所知的itertools函数?)以一种更简洁、更优雅的方式实现我想要的。
推荐答案
这里是一个基于Karl's answer的版本,它不需要列表(tmp、切片和压缩列表)的副本。对于大型列表,izip比(Python2)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]
timeit测试表明,它的速度大约是Karl的答案或我最快的groupby版本的两倍。
如果您的列表可以包含Nones,请确保使用None以外的值(如object())。
如果您需要此版本来处理不是序列的迭代器/可迭代对象,或者您的组很长:
[key for key, group in groupby(li)
if (next(group) or True) and next(group, None) is None]
timeit显示对于1,000个项目组,它的速度大约是其他版本的10倍。
较早、较慢版本:
[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]
这篇关于删除列表中连续重复元素的巧妙方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:删除列表中连续重复元素的巧妙方法
基础教程推荐
猜你喜欢
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
