博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Python Cookbook(第3版)中文版》——1.10 从序列中移除重复项且保持元素间顺序不变...
阅读量:7056 次
发布时间:2019-06-28

本文共 1412 字,大约阅读时间需要 4 分钟。

本节书摘来自异步社区《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):        ...

转载地址:http://klmol.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
了解CDP持续数据保护
查看>>
2011 Web设计的10大趋势
查看>>
centos6.5 下 mysql数据库的安装与配置
查看>>
SQL Server 维护计划
查看>>
快速低成本的搭建一个马马虎虎的博客
查看>>
Squid + DNS配置CDN加速服务器(概念篇)
查看>>
Spring数据库操作组件
查看>>
lanmp v2.5安装soap支持方法
查看>>
普华永道发表2012年全球信息安全状况调查报告
查看>>
关于SIEM和LM产品形态的小调查
查看>>
我的eclipse插件列表
查看>>
老板决策不当,是自己在“找死”
查看>>
JS创建类和对象
查看>>
linkcloud:KVM虚拟化渐趋成熟 可与XEN和Vmware比肩
查看>>
3月9日作业
查看>>
Redhat安装Oracle 11G 数据库
查看>>
Python: 字符编码基础及中文乱码
查看>>
马哥笔记第十七天openssl、CA、scp、sftp、ssh
查看>>
我的友情链接
查看>>