简单的方法实现

def dedupe(items):seen = []for item in items:if item not in seen:seen.append(item)return seensequence = [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 itemseen.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 seensequence = [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 seensequence = [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?

python 序列去重并保持原始顺序相关推荐

  1. python列表去重_python列表去重

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 方法一:利用集合去重 # ! usrbinpython3# -*- coding ...

  2. python字符串去重保持原顺序_python实现文本去重且不打乱原本顺序

    代码也是在网上找的,效率挺不错的,特别适合字典文件的去重 #coding=utf-8 import sys def open_txt(): #打开TXT文本写入数组 try: xxx = file(s ...

  3. python怎么打印字典_在python中打印字典的原始输入顺序

    如何按照我设置的原始顺序打印出我的字典? 如果我有这样的字典: smallestCars = {'Civic96': 12.5, 'Camry98':13.2, 'Sentra98': 13.8} 我 ...

  4. python去重排序_python读取TXT到数组及列表去重后按原来顺序排序的方法

    #################################################################### # python 读取TXT到数组 列表去重,不打乱原来的顺序 ...

  5. 《Python Cookbook 3rd》笔记(1.10):删除序列相同元素并保持顺序

    删除序列相同元素并保持顺序 问题 怎样在一个序列上面保持元素顺序的同时消除重复的值? 解法 如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题.比如: def ...

  6. python列表去重不改变顺序_Python列表中去重的多种方法

    怎么快速的对列表进行去重呢,去重之后原来的顺序会不会改变呢? 去重之后顺序会改变 set去重 列表去重改变原列表的顺序了 l1 = [1,4,4,2,3,4,5,6,1] l2 = list(set( ...

  7. you need python_Life is short,you need Python——Python序列(列表)

    一.序列 序列是一种数据存储方式,用来存储一系列的数据. 在内存中,序列就是一块用来存放多个值的连续的内存空间.比如一个整数序列[10,20,30,40],可以这样示意表示: 由于 Python3 中 ...

  8. python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发

    python中表达式4+0.5值的数据类型为?_后端开发 python中表达式4+0.5值的数据类型为浮点型,因为4是整型,0.5是浮点型,在python中规定整型和浮点型相加,结果是浮点型,这是为了 ...

  9. b是python文件二进制打开_如何在Python中打开和显示原始二进制数据?

    'rb'模式允许您从Python中的文件读取原始二进制数据:with open(filename, 'rb') as file: raw_binary_data = file.read() type( ...

  10. python序列类型-python序列类型种类详解

    python序列类型包括哪三种 python序列类型包括:列表.元组.字典 列表:有序可变序列 创建:userlist = [1,2,3,4,5,6] 修改:userlist[5] = 999 添加: ...

最新文章

  1. spring ioc原理分析
  2. win10 自定义分辨率
  3. python中turtle画酷炫图案-酷炫的动态可视化交互大屏,用Excel就能做!
  4. VS2008 error RC2170: bitmap file xxx.png is not in 3.00 format(转)
  5. Java获取页面中所有图片的地址
  6. c#与java_C#与Java的区别
  7. r语言 python 书_推荐关于R的几本书
  8. ssm执行linux 指令,Linux逻辑卷快照及ssm的使用
  9. mysql 三种工作模式_mybatis三种批量插入方式对比【面试+工作】
  10. 《虚拟化与云计算》读书感(九)服务器虚拟化的其他核心技术
  11. spark RDD概念及组成详解
  12. 如何在Adobe Illustrator中矢量化图像
  13. 高仿京东分类页面实现
  14. 正确的座机号码格式_正确的填写手机号码的格式是什么?
  15. 重庆工商大学研究生院计算机,重庆工商大学研究生院
  16. python中冒号报错_Python初学者 冒号报错
  17. vb.net多线程例子
  18. PS制作华丽的紫色立体字
  19. 新Word文档借用旧文档的部分样式
  20. 基于云虚拟机的代码覆盖率

热门文章

  1. java cropper 上传_基于cropper.js的图片上传和裁剪
  2. 【安全牛学习笔记】密码嗅探、中间人攻击
  3. IE无法打开internet网站已终止操作的解决的方法
  4. 大神级ppt作品欣赏_中班美术课件星空PPT课件教案图片音乐
  5. java计算机毕业设计高校墨香文学社管理系统源码+mysql数据库+系统+lw文档+部署
  6. VOCALOID笔记
  7. java项目实现html转pdf的需求(支持中文和CSS样式)
  8. C语言格式化输出函数printf详解——C语言基础知识
  9. antdesignpro 权限_ant design pro 权限控制
  10. java tfidf_Hanlp分词实例:Java实现TFIDF算法