python 序列去重并保持原始顺序操作

 更新时间:2022年03月23日 08:27:39   作者:ctrl A_ctrl C_ctrl V  
这篇文章主要介绍了python序列去重并保持原始顺序操作,文章围绕了python 序列去重的相关资料展开详细介绍,需要的小伙伴可以参考一下,希望对你的有所帮助

一、简单的方法实现

def dedupe(items):
    seen = []
    for item in items:
        if item not in seen:
            seen.append(item)
    return seen

sequence = [1, 2, 3, 5, 2, 3, 4]
print((dedupe(sequence)))    # [1, 2, 3, 5, 4]

二、用 set 和 yield 实现

代码:

def dedupe(items):
    seen = set()    # 集合set是一个无序不重复元素集
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)          


sequence = [1, 2, 3, 5, 2, 3, 4]
print(list(dedupe(sequence)))    # [1, 2, 3, 5, 4]
# list(dedupe(sequence))是将生成器中的结果呈现出来

这里对set和yield进行研究。如果不用yield可不可以呢,毕竟用生成器会很难理解,那么首先去掉yied,返回seen:

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


sequence = [1, 2, 3, 5, 2, 3, 4]
print(list(dedupe(sequence)))    # [1, 2, 3, 4, 5]

可以发现输出的元素并没有保持原有的顺序,这是因为set的特性导致的。set是一个一个无序不重复元素集,使用 add()方法向set中添加元素时并不会将元素添加到末尾,而是按照顺序插入到了中间位置。

我们可以逐步打印 seen 的内容看一下:

def dedupe(items):
    seen = set()
    for item in items:
        if item not in seen:
            seen.add(item)
            print("seen: ",seen)
    return seen

sequence = [1, 2, 3, 5, 2, 3, 4]
print("sequence元素: ",dedupe(sequence))

# output:
seen:  {1}
seen:  {1, 2}
seen:  {1, 2, 3}
seen:  {1, 2, 3, 5}
seen:  {1, 2, 3, 4, 5}
sequence元素:  {1, 2, 3, 4, 5}

可以发现向集合 {1, 2, 3, 5} 中 add(4),得到的是 {1, 2, 3, 4, 5},而不是 {1, 2, 3, 5, 4},这就是 set 无序性的体现。

那么为什么用 yield 就可以实现保持顺序的功能呢?因为 yield 生成器会逐个返回 1, 2, 3, 5, 4

那么为什么 print(list(dedupe(sequence)) )会输出 [1, 2, 3, 5, 4] 呢?因为 list(dedupe(sequence)) 是将生成器中的结果呈现出来,直接打印生成器 print(dedupe(sequence)) 只会输出地址,不会输出内容,

三、Python列表去重并保持顺序为什么使用yield?

list(dedupe(a))的作用是将生成器中的结果呈现出来,所以顺序没有改变。修改一下函数就能看到seen,

如图:

在函数中打印seen:

可以看见在中间出现了一个集合,就是seen,如果去掉print中的list,则打印:

此时出现了一个生成器(generator),但没有打印print(seen)。为什么呢?因为不调用生成器的话,程序只执行到yeild item,不继续往下执行了。

我们可以使用next()方法调用生成器:

输出结果:

可以看出生成器调用了第一个数值5,此时停在第二个数值处,再用next方法调用时,将打印第二个数值2 ,再用next方法调用时,将打印第三个数值1 :

这里用next调用生成器时,必须将生成器实例化,即g = dedupe(a),如果仍然用next(dedupe(a))将一直打印5,因为Python会认为你又重新调用了一次函数。

结果:

到此这篇关于python 序列去重并保持原始顺序操作的文章就介绍到这了,更多相关python 序列去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 定时器每天就执行一次的实现代码

    python 定时器每天就执行一次的实现代码

    这篇文章主要介绍了python 定时器每天就执行一次的实现代码,代码简单易懂非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python递归法实现简易连连看小游戏

    python递归法实现简易连连看小游戏

    这篇文章主要为大家详细介绍了python递归法实现简易连连看小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 使用python实现抓取腾讯视频所有电影的爬虫

    使用python实现抓取腾讯视频所有电影的爬虫

    这篇文章主要介绍了使用python实现抓取腾讯视频所有电影的爬虫,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Python实现在PyPI上发布自定义软件包的方法详解

    Python实现在PyPI上发布自定义软件包的方法详解

    在Python中我们经常使用pip来安装第三方Python软件包,其实我们每个人都可以免费地将自己写的Python包发布到PyPI上。本文我们就将详细介绍如何发布测试包,需要的可以参考一下
    2022-06-06
  • Python实现注册登录系统

    Python实现注册登录系统

    这篇文章主要为大家详细介绍了适合初学者学习的Python3银行账户登录系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 如何用Python进行时间序列分解和预测

    如何用Python进行时间序列分解和预测

    这篇文章主要介绍了如何用Python进行时间序列分解和预测,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • 如何解决flask修改静态资源后缓存文件不能及时更改问题

    如何解决flask修改静态资源后缓存文件不能及时更改问题

    在本篇内容里小编给大家整理的是关于如何解决flask修改静态资源后缓存文件不能及时更改问题,需要的朋友们可以学习下。
    2020-08-08
  • python中PIL安装简单教程

    python中PIL安装简单教程

    这篇文章主要为大家分享了python中PIL安装简单教程,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Python编解码问题及文本文件处理方法详解

    Python编解码问题及文本文件处理方法详解

    最近在做一个项目,因为文本处理的内容是中文,所以不得不面对python中文处理所带来的种种困惑,这篇文章主要给大家介绍了关于Python编解码问题及文本文件处理方法的相关资料,需要的朋友可以参考下
    2021-06-06
  • python ansible服务及剧本编写

    python ansible服务及剧本编写

    python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack)。其功能实现基于SSH远程连接服务;ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能
    2017-12-12

最新评论