本文摘自php中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于Python实现从序列中移除重复项且保持元素间顺序不变,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1、需求
我们想去除序列出现的重复元素,但仍然保持剩下的元素的顺序不变。如果只是想要去重,那么通常足够简单的方法就是构建一个集合:
1 2 3 | a=[1,5,4,36,7,8,2,3,5,7]
#结果为:{1, 2, 3, 4, 5, 36, 7, 8}
print (set(a))
|
2、解决方案
如果序列中的值是可哈希的(hashable),那么这个问题可以通过使用集合和生成器轻松解决。
如果一个对象是可哈希的,那么它的生存期内必须是不可变的,它需要有一个__hash__()
方法。整数、浮点数、字符串、元素都是不可变的。1 2 3 4 5 6 7 8 9 | 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 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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' ])))
|
运行结果:
1 2 | [{ '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的作用是指定一个函数用来将序列中的元素转换为可哈希的类型,那么做的目的是为了检测重复项。
以上就是Python实现从序列中移除重复项且保持元素间顺序不变的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python怎么读写excel
Python //什么意思
Python强大之处在哪里
Python字符串的处理那些事
Python怎么打开使用
详解关于Python中文件的读取和写入
Python头文件怎么写
Python可以写病毒吗
Python实现两个文件合并功能
Python记录程序运行时间的方法介绍
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » Python实现从序列中移除重复项且保持元素间顺序不变