Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法

本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法。分享给大家供大家参考,具体如下:

问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变

解决方案:

1、如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决。

# example.py
#
# Remove duplicate entries from a sequence while keeping order
def dedupe(items):
  seen = set()
  for item in items:
    if item not in seen:
      yield item
      seen.add(item)
if __name__ == '__main__':
  a = [1, 5, 2, 1, 9, 1, 5, 10]
  print(a)
  print(list(dedupe(a)))

运行结果:

[1, 5, 2, 1, 9, 1, 5, 10]
[1, 5, 2, 9, 10]

2、如果序列时不可哈希的,想要去除重复项,需要对上述代码稍作修改:

# example2.py
#
# Remove duplicate entries from a sequence while keeping order
def dedupe(items, key=None):
  seen = set()
  for item in items:
    val = item if key is None else key(item)
    if val not in seen:
      yield item
      seen.add(val)
if __name__ == '__main__':
  a = [
    {'x': 2, 'y': 3},
    {'x': 1, 'y': 4},
    {'x': 2, 'y': 3},
    {'x': 2, 'y': 3},
    {'x': 10, 'y': 15}
    ]
  print(a)
  print(list(dedupe(a, key=lambda a: (a['x'],a['y']))))

运行结果:

[{'x': 2, 'y': 3}, {'x': 1, 'y': 4}, {'x': 2, 'y': 3}, {'x': 2, 'y': 3}, {'x': 10, 'y': 15}]
[{'x': 2, 'y': 3}, {'x': 1, 'y': 4}, {'x': 10, 'y': 15}]

key参数的作用是指定一个函数用来将序列中的元素转化为可哈希的类型,如此可以检测重复项。

(代码摘自《Python Cookbook》)

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

您可能感兴趣的文章:

  • python 切片和range()用法说明
  • 深入解析Python中的list列表及其切片和迭代操作
  • 彻底理解Python list切片原理
  • Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
  • Python中关于Sequence切片的下标问题详解
  • 分析python切片原理和方法
  • Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
  • Python cookbook(数据结构与算法)字典相关计算问题示例
  • Python cookbook(数据结构与算法)让字典保持有序的方法
  • Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
  • Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
  • Python cookbook(数据结构与算法)对切片命名清除索引的方法
(0)

相关推荐

  • Python cookbook(数据结构与算法)对切片命名清除索引的方法

    本文实例讲述了Python对切片命名清除索引的方法.分享给大家供大家参考,具体如下: 问题:如何清理掉到处都是硬编码的切片索引 解决方案:对切片命名 假设有一些代码用来从字符串的固定位置中取出具体的数据(比如从一个平面文件或类似的格式:平面文件flat file是一种包含没有相对关系结构的记录文件): ########0123456789012345678901234567890123456789012345678901234567890123456789 record='...........

  • 彻底理解Python list切片原理

    关于list的insert函数 list#insert(ind,value)在ind元素前面插入value 首先对ind进行预处理:如果ind<0,则ind+=len(a),这样一来ind就变成了正数下标 预处理之后, 当ind<0时,ind=0,相当于头部插入  当ind>len(a)时,ind=len(a),相当于尾部插入 切片实例 Python中的列表切片非常灵活,要根据表象来分析它的内在机理,这样用起来才能溜. 下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我

  • Python cookbook(数据结构与算法)让字典保持有序的方法

    本文实例讲述了Python让字典保持有序的方法.分享给大家供大家参考,具体如下: 问题:创建一个字典,同时对字典做迭代或序列化操作时,也能控制其中元素的顺序: 解决方案:可以使用collections模块中的OrderedDict类来控制字典中元素的顺序.当对字典做迭代时,他会严格按照元素初始添加的顺序进行.例如: from collections import OrderedDict d=OrderedDict() d['foo']=1 d['bar']=2 d['spam']=3 d['gr

  • 分析python切片原理和方法

    使用索引获取列表的元素(随机读取) 列表元素支持用索引访问,正向索引从0开始 colors=["red","blue","green"] colors[0] =="red" colors[1]=="blue" 同时,也可以使用负向索引(python中有序序列都支持负向索引) colors[-1]=="green" 列表的切片操作 切片操作不是列表特有的,python中的有序序列都支持切片

  • Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例

    本文实例讲述了python找到最大或最小的N个元素实现方法.分享给大家供大家参考,具体如下: 问题:想在某个集合中找出最大或最小的N个元素 解决方案:heapq模块中的nlargest()和nsmallest()两个函数正是我们需要的. >>> import heapq >>> nums=[1,8,2,23,7,-4,18,23,42,37,2] >>> print(heapq.nlargest(3,nums)) [42, 37, 23] >&g

  • 深入解析Python中的list列表及其切片和迭代操作

    有序列表list >>> listTest = ['ha','test','yes'] >>> listTest ['ha', 'test', 'yes'] len()获取list元素个数. >>> len(listTest) 3 可以用索引来访问每一个元素,0表示第一个,-1还可以表示最后一个,即倒数第一个,依此类推-2表示倒数第二个,超过了也会报越界错误. >>> listTest[0] 'ha' >>> lis

  • Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法

    本文实例讲述了Python在字典中将键映射到多个值上的方法.分享给大家供大家参考,具体如下: 问题:一个能将键(key)映射到多个值的字典(即所谓的一键多值字典[multidict]) 解决方案:如果想让键映射到多值,需要将这多个值保持到另一个容器如列表或集合中: >>> d={'a':[1,2,3],'b':[4,5]} >>> d {'b': [4, 5], 'a': [1, 2, 3]} >>> e={'a':{1,2,3,3},'b':{4,5

  • python 切片和range()用法说明

    理解切片基本用法: 首先需要明白,可迭代对象,按照正数索引(正序)是从0开始的,按照负数索引(逆序)是从-1开始的.>>> astring = 'Hello world'>>> astring[0:2]'He'>>> 可见,这种情况下,给切片操作一个起始位置,和一个终止位置,则显示从起始位置开始(包括起始位置)到终止位置(不包括终止位置)之间的内容: 在有负数索引的情况下,是类似的,只要确定终止位置的内容: >>> astring[0

  • Python cookbook(数据结构与算法)字典相关计算问题示例

    本文实例讲述了Python cookbook(数据结构与算法)字典相关计算问题.分享给大家供大家参考,具体如下: 问题:在字典上对数据执行各式各样的计算(比如求最小值.最大值.排序). 解决方案:利用zip()将字典的键-值对"反转"为值-键对序列. 例如:如下字典存放的股票名称和对应的价格: >>> prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 }

  • Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】

    本文实例讲述了Python列表list操作符.分享给大家供大家参考,具体如下: #coding=utf8 ''''' 列表也可以使用比较操作符,比较时更加ASCII进行比较的. 比较列表时也用内建函数cmp()函数: 两个列表的元素分别比较,直到有一方胜出. 元组进行比较操作时和列表遵循相同的逻辑. 列表的切片操作和字符串的切片操作很像, 不过列表的切片操作返回的是一个对象或者几个对象的集合. 列表的切片操作也遵循从正负索引规则,也有开始索引值,结束索引值, 如果这两个值为空,默认为序列的开始和

  • Python中关于Sequence切片的下标问题详解

    前言 在python中, 切片是一个经常会使用到的语法, 不管是元组, 列表还是字符串, 一般语法就是: sequence[ilow:ihigh:step] # ihigh,step 可为空; 为了简短易懂, 暂时排除step的用法考虑 先来简单示范下用法 sequence = [1,2,3,4,5] sequence [ilow:ihigh] # 从ilow开始到ihigh-1结束 sequence [ilow:] # 从ilow开始直到末尾 sequence [:ihigh] # 从头部开始

  • Python cookbook(数据结构与算法)实现查找两个字典相同点的方法

    本文实例讲述了Python实现查找两个字典相同点的方法.分享给大家供大家参考,具体如下: 问题:寻找两个字典中间相同的地方(相同的键.相同的值等) 解决方案:通过keys()或者items()方法来执行常见的集合操作(比如求并集.交集和差集) >>> a={'x':1,'y':2,'z':3} >>> b={'ww':10,'x':11,'y':2} >>> a.keys()& b.keys() #键的交集 {'y', 'x'} >>

随机推荐