美文网首页
删除序列相同元素并保持顺序

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

作者: limbo1996 | 来源:发表于2021-01-12 22:32 被阅读0次

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

问题

在序列上保持元素顺序的同时删除重复的值

解决

>>> def dedup(items):
...     seen = set()
...     for item in items:
...         if item not in seen:
...             seen.add(item)
...     return seen
... 
>>> a = [1, 5, 2, 1, 9, 1, 5, 10]    
>>> list(dedup(a))
[1, 2, 5, 9, 10]

首先看错误的,上面代码虽然完成了去重,但是元素的位置发生了变化

下面是正确代码

>>> def dedup(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(dedup(a))
[1, 5, 2, 9, 10]

这里的方法仅适用于元素是可哈希的,而yield的作用就是返回迭代器。

可以将上面的函数改造一下看一下结果

def dedup(items):
    seen = set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)
            print('a')
>>> list(dedup(a))
a
a
a
a
a
[1, 5, 2, 9, 10]

因为dedup函数带yield,所以它返回的是一个迭代器,我们可以用next()函数,分步运行便于理解

>>> c = dedup(a)  
>>> next(c)
1
>>> next(c)
a
5
>>> next(c)
a
2
>>> next(c)
a
9
>>> next(c)
a
10

c是一个迭代器,调用next()发现,每一次的函数运行只进行到yield字段,yield后面的在下次函数调用中完成。

如果想消除元素不可哈希的序列中的重复元素(比如字典),需要把代码再改一下

>>> def dedup(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)
... 

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


相关文章

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

    删除序列相同元素并保持顺序 问题 在序列上保持元素顺序的同时删除重复的值 解决 首先看错误的,上面代码虽然完成了去...

  • 【2017-09-08】数据结构与算法(七)

    序列 删除相同元素并保持序列顺序问题:*怎样在一个序列上面保持元素顺序的同时消除重复的值?方案:利用集合,但是不维...

  • [数据结构] __ 两个关于顺序表的小练习

    顺序表有序排列,使插入元素自动插入到合适的位置, 删除从某个元素开始的n位元素. 定义一个顺序表类,并实现所需要的...

  • C/C++基础知识(六)——异常、容器、命名空间

    异常处理 容器 序列式容器 元素排列顺序和元素本身无关,有添加顺序决定序列式容器有:vector,list,deq...

  • 线性表

    线性表是n个相同数据类型的元素组成的有限序列。线性表按照存储结构可分为顺序表和链表。顺序表都是内存地址连续的元素组...

  • Checkio笔记 - Sort Array by Elemen

    题目 本题是对一个给定的序列进行排序,排序的方式为: 对序列中出现的元素,按照频率从高到低的顺序排练 对于频率相同...

  • python序列和其它类型的比较

    序列对象可以与相同类型的其他对象比较。它们使用字典顺序进行比较:首先比较两个python序列的第一个元素,如果不同...

  • 数据结构-顺序表的定义及python实现

    1 顺序表的定义 线性表 是具有相同数据类型的n个数据元素的有限序列。 顺序表 使用组地址连续的存储单元、依次存...

  • chap2 线性表

    1 顺序表 1. 顺序表删除所有值为x的元素 基本思想 用k记录要删除的元素的个数,并将扫描到的不要删除的元素向前...

  • 必须要掌握的排序相关知识点!!!

    稳定性 假设在待排序的序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对顺序保持不变,即在原序列中,...

网友评论

      本文标题:删除序列相同元素并保持顺序

      本文链接:https://www.haomeiwen.com/subject/vtbjaktx.html