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 序列去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你使用TensorFlow2识别验证码

    教你使用TensorFlow2识别验证码

    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,本文主要介绍了 TensorFlow2识别验证码,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 对python 通过ssh访问数据库的实例详解

    对python 通过ssh访问数据库的实例详解

    今天小编就为大家分享一篇对python 通过ssh访问数据库的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python详解文字转语音的实现

    Python详解文字转语音的实现

    在自然语言处理上,文字、音频互转是一个很关键的技术点。对于语音转文字,个人实现较为困难,我们可以使用语音转文字的软件或借助各API(如科大讯飞等)进行移植开发。不过文字转语音就相对而言容易实现很多了
    2022-02-02
  • python Ajenti控制面板轻松地管理所有服务器网站

    python Ajenti控制面板轻松地管理所有服务器网站

    Ajenti是一个值得拥有的管理面板,免费开源的管理面板工具,可以帮助你集中管理多个服务器和网站,Ajenti 支持 Linux、BSD、Mac OS X和Windows 等多个操作系统,并且可以通过一个直观的 Web 界面来完成各种系统管理任务
    2024-01-01
  • python如何实现不可变字典inmutabledict

    python如何实现不可变字典inmutabledict

    这篇文章主要介绍了python如何实现不可变字典inmutabledict,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解Python 3.10 中的新功能和变化

    详解Python 3.10 中的新功能和变化

    这篇文章主要介绍了详解Python 3.10 中的新功能和变化,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • Python基于codecs模块实现文件读写案例解析

    Python基于codecs模块实现文件读写案例解析

    这篇文章主要介绍了Python基于codecs实现文件读写案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python PIL Image 图像处理基本操作实例

    python PIL Image 图像处理基本操作实例

    这篇文章主要介绍了python PIL Image 图像处理基本操作实例包括图片加载、灰度图,图像通道分离和合并,在图像上输出文字,图像缩放,图像阈值分割、 二值化,图像裁剪需要的朋友可以参考下
    2022-04-04
  • Python中@符号的用法小结

    Python中@符号的用法小结

    @符号在Python中最常见的使用情况是在装饰器中,本文主要介绍了Python中@符号的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • python中的decimal类型转换实例详解

    python中的decimal类型转换实例详解

    decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算。这篇文章主要介绍了python里的decimal类型转换,需要的朋友可以参考下
    2019-06-06

最新评论