本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第1章,第1.10节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.10 从序列中移除重复项且保持元素间顺序不变

1.10.1 问题

我们想去除序列中出现的重复元素,但仍然保持剩下的元素顺序不变。

1.10.2 解决方案

如果序列中的值是可哈希(hashable)的,那么这个问题可以通过使用集合和生成器轻松解决。示例如下[1]:

def dedupe(items):

seen = set()

for item in items:

if item not in seen:

yield item

seen.add(item)

这里是如何使用这个函数的例子:

>>> a = [1, 5, 2, 1, 9, 1, 5, 10]

>>> list(dedupe(a))

[1, 5, 2, 9, 10]

>>>

只有当序列中的元素是可哈希的时候才能这么做。如果想在不可哈希的对象(比如列表)序列中去除重复项,需要对上述代码稍作修改:

def dedupe(items, key=None):

seen = set()

for item in items:

val = item if key is None else key(item)

if val not in seen:

yield item

seen.add(val)

这里参数key的作用是指定一个函数用来将序列中的元素转换为可哈希的类型,这么做的目的是为了检测重复项。它可以像这样工作:

>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]

>>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))

[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]

>>> list(dedupe(a, key=lambda d: d['x']))

[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]

>>>

如果希望在一个较复杂的数据结构中,只根据对象的某个字段或属性来去除重复项,那么后一种解决方案同样能完美工作。

1.10.3 讨论

如果想要做的只是去除重复项,那么通常足够简单的办法就是构建一个集合。例如:

>>> a

[1, 5, 2, 1, 9, 1, 5, 10]

>>> set(a)

{1, 2, 10, 5, 9}

>>>

但是这种方法不能保证元素间的顺序不变[2],因此得到的结果会被打乱。前面展示的解决方案可避免出现这个问题。

本节中对生成器的使用反映出一个事实,那就是我们可能会希望这个函数尽可能的通用——不必绑定在只能对列表进行处理。比如,如果想读一个文件,去除其中重复的文本行,可以只需这样处理:

with open(somefile,'r') as f:

for line in dedupe(f):

...

python序列中各元素之间存在顺序关系_《Python Cookbook(第3版)中文版》——1.10 从序列中移除重复项且保持元素间顺序不变-阿里云开发者社区...相关推荐

  1. python不变的数据结构是_Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法...

    本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法.分享给大家供大家参考,具体如下: 问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可 ...

  2. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

  3. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

  4. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

  5. a记录 mysql_[a]-和[a]相关的内容-阿里云开发者社区

    HDOJ 1202 The calculation of GPA Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计 ...

  6. pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区

    postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...

  7. 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 阿里云 阿里巴巴集团拥有海量的图像/视频数据,强大的计算能力和巨大的市场空 ...

  8. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  9. impdp导入表结构和表数据_EXP COMPRESS以及EXP/IMP EXPDP/IMPDP导入表结构注意-阿里云开发者社区...

    EXP COMPRESS以及EXP/IMP EXPDP/IMPDP导入表结构注意 重庆八怪 2014-09-10 987浏览量 简介: 关于EXP COMPRESS参数 一直对这个参数有些疑惑.当然此 ...

最新文章

  1. 一口一个,超灵活的Python迷你项目
  2. Httpservlet cannot be resolved to a type的原因与解决方法
  3. 基于RT-Thread开发智能视觉组智能车-乐山师范学院
  4. python趣味编程入门 迈克 桑德斯_Python趣味编程入门
  5. abp core版本添加额外应用层
  6. KDE Akademy 2008 会议
  7. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化
  8. rockmq运维指令_RocketMQ 运维指令
  9. Icon+启动图尺寸
  10. 【华为云技术分享】使用sqoop导入mysql数据到hive中
  11. Android 进行单元測试难在哪-part3
  12. Miller_Rabin测试法
  13. mac检测是否安装mysql_mac安装mysql
  14. 数据挖掘技术研究现状
  15. QT开发环境简介、安装以及搭建VS2019环境
  16. Visio 连线 取消自动附着,取消自动捕捉
  17. 2021年微软研究博士奖研金名单出炉!三位华人博士生入选,每人42000美元
  18. 深度学习中IOU的含义
  19. ADC 获取数据(stm32)
  20. 淘淘商城第44讲——搭建搜索系统工程

热门文章

  1. 分布式MySQL数据库中间件 mysqlda
  2. Ubuntu启动密码丢失的找回
  3. 深度学习 --- 优化入门二(SGD、动量(Momentum)、AdaGrad、RMSProp、Adam详解)
  4. php implicit_flush,php – ob_implicit_flush(),flush(),ob_flush() – 不在远程服务器上工作...
  5. 发的楷体怎么写_公布婚期朋友圈怎么发 发结婚通知朋友圈注意哪些
  6. android imei *#06#,[Android]Hot key IMEI *#06# and *#07#
  7. 5ecsgo启动失败2错误代码2_单机多实例--启动2个Elasticsearch Cluster
  8. ubuntu openssl_在Ubuntu下安装旧版seurat
  9. python爬虫之伪装浏览器
  10. 条款一:尽量使用const、inline而不是#define