• 技术文章 >后端开发 >Python教程

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

    不言不言2018-10-15 14:15:33转载1254
    本篇文章给大家带来的内容是关于Python实现从序列中移除重复项且保持元素间顺序不变,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    1、需求

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

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

    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__()方法。整数、浮点数、字符串、元素都是不可变的。
    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'])))

    运行结果:

    [{'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实现从序列中移除重复项且保持元素间顺序不变的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault思否,如有侵犯,请联系admin@php.cn删除
    专题推荐:python
    上一篇:Python要学哪些内容?Python程序员学习路线图 下一篇:Python实现对切片命名的方法
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• python实现查找两个字符串中相同字符并输出的方法• Python实现比较两个文件夹中代码变化的方法• Python实现的简单算术游戏实例• Python实现栈的方法• python实现的守护进程(Daemon)用法实例• Python实现删除文件但保留指定文件
    1/1

    PHP中文网