【Python编程】删除列表中具有连续重复项的元素

2023-11-03

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

输入:[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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python编程】删除列表中具有连续重复项的元素 的相关文章

随机推荐

  • VC数据类型转换大全 (转)

    VC数据类型转换大全 int i 100 long l 2001 float f 300 2 double d 12345 119 char username 程佩君 char temp 200 char buf CString str v
  • 多任务工作流难管理?看dhtmlxGantt如何实现云管理平台高效管理!

    今天我们分享一个关于KeyWorks OS为意大利公共管理机构提供的工作流解决方案 这是将dhtmlxGantt集成到低代码平台的成功案例 关于KeyWorks OS dhtmlxGantt帮助知名低代码管理平台KeyWorks OS完善B
  • 【HDFS】XXXRpcServer和ClientNamenodeProtocolServerSideTranslatorPB小记

    初始化RouterRpcServer时候会new ClientNamenodeProtocolServerSideTranslatorPB 并把当前RouterRpcServer对象 this 传入构造函数 ClientNamenodePr
  • 嵌入式调试技巧-代码自动初始化

    代码自动初始化 概述 在嵌入式开发过程中 可能会遇到初始化代码自动初始化 比如RTT中就运用到这项技术 那么初始化代码是如何做到自动化调用的呢 在嵌入式实际开发过程中 往往需要对 bsp 部分进行外设配置 以及一些模块 参数进行初始化 常见
  • macOS输入法导致系统卡住鼠标圈圈问题/风火轮

    最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的简体拼音输入法直接解决 最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的简体拼音输入法直接解决 最终解决方案 使用第三方输入法 如微信键盘 搜狗输入法取代自带的
  • This exception may occur if matchers are combined with raw values

    org mockito exceptions misusing InvalidUseOfMatchersException Invalid use of argument matchers 3 matchers expected 2 rec
  • SpringCloud利用Feign访问外部http请求

    大家好 目前接手了一个项目 具体的逻辑并不复杂 主要是一个 中间商 角色 比如客户端通过我访问高德地图API 就不需要带秘钥 直接带高德API所需的入参和url后缀 就可以访问 目前遇到这样一个问题 项目架构师要求所有的项目自己写的httt
  • 【Windows系统资源】​​​​​​​iexplore.exe命令行参数解释

    资源 C Program Files Internet Explorer iexplore exe 语法 nohome 双击此快捷方式则只打开一个空白IE窗口 可以加快IE启动速度 同时如果IE主页被恶意修改了 利用此法就不会自动打开恶意主
  • Linux指令--别名alias

    文章目录 1 定义别名 2 查看别名 3 取消别名 4 起别名的弊端 5 别名的失效 6 单引号与双引号下别名的区别 7 shell脚本中的别名 1 定义别名 格式 alias name values 等号 前后不能有空格 values中有
  • codeforces Gym 101341 K Competitions

    Problem codeforces com gym 101341 problem K vjudge net contest 162325 problem K Meaning 有 n 场比赛 每一场有 开始时间 a 结束时间 b 价值 c
  • java基于微信小程序旅游管理系统 uniapp 小程序+论文

    本旅游服务软件 主要实现了管理员后端 首页 个人中心 旅游攻略管理 旅游资讯管理 景点信息管理 门票预定管理 用户管理 酒店信息管理 酒店预定管理 推荐路线管理 论坛管理 系统管理 用户前端 首页 景点信息 酒店信息 论坛中心 我的等 总体
  • 对比openai,我更喜欢ppword的近期更新

    刚刚 23年8月17日 openai宣布收购Global Illumination Global Illumination简单说 就是人工智能落地公司 来帮chatGPT找落地场景 昨天 23年8月16日 宣布更新了内容审核的解决方案 号称
  • 机器学习算法 随机森林

    文章目录 一 概述 1 1 集成学习 1 2 决策树 1 3 随机森林 二 Sklearn中的随机森林 2 1 分类树API 2 2 参数 2 2 回归树API 2 2 1 重要参数 2 3 随机森林调参 三 总结 一 概述 1 1 集成学
  • unity渲染队列render quaue

    本文转载自http blog csdn net candycat1992 article details 37345251 本系列主要参考 Unity Shaders and Effects Cookbook 一书 感谢原书作者 同时会加上
  • shell中for循环变量常见使用场景

    shell中for循环变量常见使用场景 1 目的 在shell脚本for循环使用过程中经常出现非常规使用场景 如在awk的条件语句中 输出文本中变量后有字符等 这些场景中需要对for循环中的变量做处理 希望持续完善 2不同场景 2 1 变量
  • React配置webpack(一)

    一 安装 create react app npx create react app react webpack app cd react webpack app npm start 二 初始化项目 npm init y 三 安装所需包 w
  • Linux中Hadoop的安装与配置

    1 首先关闭虚拟机的防火墙 2 查看防火墙状态 3 然后修改主机名称 配置hosts vi etc hosts 前面是自己的主机IP地址 后面是想要修改的主机名称 修改完成保存后reboot重启即可修改完成 4 把Hadoop和jdk压缩包
  • 一文读懂迭代器(iterator)在vector中的用法

    首先写好头文件vector和string的头文件是 include
  • Linux中vim下方向键变成ABCD,backspace无法删除字符的解决办法

    在linux中安装完VIM后 发现在insert模式下 按下四个方向键在屏幕中会输出ABCD这样的字符 并且Backspace无法实现删除功能 虽然可以在normal模式下通过hjkl实现光标的移动 通过x和d实现删除功能 但是每次都要进行
  • 【Python编程】删除列表中具有连续重复项的元素

    删除列表中具有连续重复项的元素 输入 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 lt len a