栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python实用技法第9篇:从序列中移除重复项且保持元素间顺序不变

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python实用技法第9篇:从序列中移除重复项且保持元素间顺序不变

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

如果只是想要去重,那么通常足够简单的方法就是构建一个集合:

a=[1,5,4,36,7,8,2,3,5,7]
#结果为:{1, 2, 3, 4, 5, 36, 7, 8}
print(set(a))

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

如果一个对象是可哈希的,那么它的生存期内必须是不可变的,它需要有一个__hash__()方法。整数、浮点数、字符串、元素都是不可变的。

def dedupe(items):
    seen=set()
    for item in items:
 if item not in seen:
     yield item
     seen.add(item)

a=[1,2,3,1,9,1,5,10]
print(list(dedupe(a)))

运行结果:

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

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

def dedupe(items,key=None):
    seen=set()
    for item in items:
 value=item if key is None else key(item)
 if value not in seen:
     yield item
     seen.add(value)

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

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

print(list(dedupe(a,key=lambda d:d['y'])))
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

运行结果:

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/220638.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号