首页 > 其他分享 >删除序列相同元素并保持顺序

删除序列相同元素并保持顺序

时间:2023-12-17 12:32:45浏览次数:29  
标签:顺序 删除 元素 item key 序列 seen dedupe

问题

怎样在一个序列上面保持元素顺序的同时消除重复的值?

解决方案

如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解 决这个问题。比如:

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

  下面是使用上述函数的例子:

>>> a = [1, 5, 2, 1, 9, 1, 5, 10] >>> list(dedupe(a))
[1, 5, 2, 9, 10]
>>>

这个方法仅仅在序列中元素为 hashable 的时候才管用。如果你想消除元素不可哈 希(比如 dict 类型)的序列中重复元素的话,你需要将上述代码稍微改变一下,就像 这样:

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)

这里的 key 参数指定了一个函数,将序列元素转换成 hashable 类型。下面是它的 用法示例:

>>> a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}] >>> list(dedupe(a, key=lambda d: (d['x'],d['y'])))
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]
>>> list(dedupe(a, key=lambda d: d['x']))
[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]
>>>

如果你想基于单个字段、属性或者某个更大的数据结构来消除重复元素,第二种方 案同样可以胜任。

讨论

如果你仅仅就是想消除重复元素,通常可以简单的构造一个集合。比如:
>>> a
[1, 5, 2, 1, 9, 1, 5, 10] >>> set(a)
{1, 2, 10, 5, 9}
>>>

然而,这种方法不能维护元素的顺序,生成的结果中的元素位置被打乱。而上面的 方法可以避免这种情况。

在本节中我们使用了生成器函数让我们的函数更加通用,不仅仅是局限于列表处 理。比如,如果如果你想读取一个文件,消除重复行,你可以很容易像这样做:

with open(somefile,'r') as f: for line in dedupe(f):
...

标签:顺序,删除,元素,item,key,序列,seen,dedupe
From: https://blog.51cto.com/u_16251183/8861182

相关文章

  • Android深入学习之Activity与Fragment之间回调函数的调用顺序
    本文使用的例子是用WelcomeActivity托管WelcomeFragment。先来看Log。1.WelcomeActivityWelcomeActivitycreated!2.WelcomeActivityonCreate2.1.WelcomeFragmentWelcomeFragmentcreated!2.2.FragmentManagerCommit:BackStackEntry{cc......
  • elasticsearch 文档删除操作:delete和delete_by_query
    api:(elasticsearch版本7.3)#删除指定id的文档DELETE/<index>/_doc/<_id>#按查询条件删除POST/<index>/_delete_by_query1.DELETE/<index>/_doc/<_id>删除指定id的文档#测试--删除文档DELETE/king_test_person/_doc/223/2.POST/<index>/_dele......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,
    一、24.两两交换链表中的节点题目链接:LeetCode24.两两交换链表中的节点学习前:思路:未新增虚拟结点。节点数为0,1,2需要另外讨论。当节点数>=2时,返回的head值为第2个节点,需要3个指针first、second、prev,分别是第一个节点和第二个节点,以及第一个节点的前节点。while(first......
  • File类的基础使用(四) - 删除功能
    1.4File类删除功能方法分类方法名说明publicbooleandelete()删除由此抽象路径名表示的文件或目录publicclassFileDemo03{publicstaticvoidmain(String[]args)throwsIOException{//Filef1=newFile("E:\\51cto\\java.txt");......
  • 2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和
    2023-12-16:用go语言,给定整数数组arr,求删除任一元素后,新数组中长度为k的子数组累加和的最大值。来自字节。答案2023-12-16:来自左程云。灵捷3.5大体步骤如下:算法maxSum1分析:1.计算输入数组arr的长度n。2.如果n<=k,则返回0。3.初始化ans为int类型的最小值(math......
  • 2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和
    2023-12-16:用go语言,给定整数数组arr,求删除任一元素后,新数组中长度为k的子数组累加和的最大值。来自字节。答案2023-12-16:来自左程云。灵捷3.5大体步骤如下:算法maxSum1分析:1.计算输入数组arr的长度n。2.如果n<=k,则返回0。3.初始化ans为int类型的最小值(math.MinInt32)......
  • 19.删除链表的倒数第N个节点
    题目19.删除链表的倒数第N个节点要求给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。答案先看看直接思路,首先遍历一遍,计算出元素的个数,之后计算出正向遍历要删除的元素,注意的是要创建一个虚拟节点,目的是可能删除头节点,如果删除头节点,没有虚拟节点,不易删除,当然......
  • 解锁RocketMQ秘籍:如何保障消息顺序性?
    嗨,小伙伴们!小米在这里啦!今天我们要聊的话题是社招面试中一个经典而又百思不得其解的问题——“RocketMQ如何保证顺序性?”不用担心,小米来给你揭秘RocketMQ的秘密武器,让你轻松过关面试大关!引言:为什么要谈顺序性?首先,我们得明白为什么在消息队列中要讲究消息的顺序性。假设你正在开发一......
  • SQLServer删除数据库特别耗时
    在老库删除数据库的时候,如果选中到了选项"DeletebackupandRestoreHistoryInformationfordatabases"。发现删除操作要耗费很久的时间,甚至好几天。查看一下正在执行的会话信息,看看数据库都在做啥:SELECTs.session_id,r.STATUS,r.blocking_session_id'Blkby'......
  • C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?
    C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法。智能指针模板参数的第二个类型是删除器,一般是一个函数指针类型或者是一个函数对象类型。通常情况下,删除器的类型是std::default_delete<T>,它是一个函数对象类型,用于......