python - 从模式重复的 Python 列表中删除重复字符
问题描述
我正在监视一个发送如下数据的串行端口:
['','a','a','a','a','a','a','','b','b','b','b','b','b','b','b',
'','','c','c','c','c','c','c','','','','d','d','d','d','d','d','d','d',
'','','e','e','e','e','e','e','','','a','a','a','a','a','a',
'','','','b','b','b','b','b','b','b','b','b','','','c','c','c','c','c','c',
'','','','d','d','d','d','d','d','','','e','e','e','e','e','e',
'','','a','a','a','a','a','a','','b','b','b','b','b','b','b','b',
'','','c','c','c','c','c','c','','','','d','d','d','d','d','d','d','d',
'','','e','e','e','e','e','e','','','a','a','a','a','a','a',
'','','','b','b','b','b','b','b','b','b','b','','','c','c','c','c','c','c',
'','','','d','d','d','d','d','d','','','e','e','e','e','e','e','','']
我需要能够将其转换为:
['a','b','c','d','a','b','c','d','a','b','c','d','a','b','c','d']
所以我要删除重复项和空字符串,但也要保留模式重复的次数。
我一直无法弄清楚。有人可以帮忙吗?
解决方案
这是使用列表推导和itertools.zip_longest的解决方案:仅当元素不是空字符串且不等于下一个元素时才保留该元素。您可以使用迭代器跳过第一个元素,以避免切片列表的成本。
from itertools import zip_longest
def remove_consecutive_duplicates(lst):
ahead = iter(lst)
next(ahead)
return [ x for x, y in zip_longest(lst, ahead) if x and x != y ]
用法:
>>> remove_consecutive_duplicates([1, 1, 2, 2, 3, 1, 3, 3, 3, 2])
[1, 2, 3, 1, 3, 2]
>>> remove_consecutive_duplicates(my_list)
['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd',
'e', 'a', 'b', 'c', 'd', 'e']
我假设没有由空字符串(例如'a', '', 'a'
)分隔的重复项,或者您不想删除此类重复项。如果这个假设是错误的,那么你应该先过滤掉空字符串:
>>> example = ['a', '', 'a']
>>> remove_consecutive_duplicates([ x for x in example if x ])
['a']
推荐阅读
- c - 如何在 C 中订阅端口打开或端口关闭事件?
- javascript - 在文档就绪事件发生时,window.open 在 iphone 中不起作用
- asp.net-core - 在.net core 3.0中将通用c#模型序列化为xml
- javascript - 解构覆盖现有值
- maven - 机器人框架及其库如何放入 POM 以安装在 docker 上
- c# - .NET Core 类库项目:缺少 ADO.net 实体数据模型模板
- sql - 有没有更好的方法来存储关于 2 表关系的数据?
- azure-devops - 无法使用提供的 Databricks 扩展部署 Databricks Notebook
- html - 从外部资源覆盖 CSS
- javafx - 有没有办法在javafx中制作图像饱和动画?