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

    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]

  eg2:
    这个方法仅仅在序列中元素为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}]

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

附:

  hash是什么意思?

  Hash,一般翻译成‘散列’,也有直译成‘哈希’的,把任意长度的输入通过散列算法,变成固定长度的输出。该输出就是散列值。

  这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

  简单的说是将一种任意长度的消息压缩到某一固定长度的消息摘要的函数。

  HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位编码里,叫做HASH值。

  也就是说hash就是找到一种数据内容和数据存放地址之间的映射关系

  著名的hash算法,MD5和SHA1是目前应用最广泛的Hash算法,他们都是以MD4为基础设计的

Python: 序列list:保持元素顺序同时消除重复值的更多相关文章

  1. Python collections.OrderedDict解决dict元素顺序问题

    编程中遇到个问题,python json.loads时元素顺序可能会发生变化. 这个对于一些需要使用元素顺序来做一些策略的代码来说是致命的. 在网上查了查,结合自己的知识总结一下. 使用dict时,K ...

  2. java消除 list重复值及交集,并集,差集

    消除 list重复值 Java代码  public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...

  3. python序列元素引用容易出错的地方

    python序列分列表和元组,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可.举个简单的例子,a1是一个元组,a2是一个列表 ...

  4. python中的enumerate函数用于遍历序列中的元素以及它们的下标

    enumerate 函数用于遍历序列中的元素以及它们的下标: >>> for i,j in enumerate(('a','b','c')): print i,j 0 a1 b2 c ...

  5. 【Python⑤】python序列---list和tuple

    sequence 序列 sequence(序列)是一组有顺序的对象的集合.序列可以包含一个或多个元素,也可以没有任何元素. 我们之前所说的基本数据类型,都可以作为序列的对象.对象还可以是另一个序列.序 ...

  6. [Python笔记][第二章Python序列-tuple,dict,set]

    2016/1/27学习内容 第二章 Python序列-tuple tuple创建的tips a_tuple=('a',),要这样创建,而不是a_tuple=('a'),后者是一个创建了一个字符 tup ...

  7. [python笔记][第二章Python序列-list]

    2016/1/27学习内容 第二章 Python序列-list list常用操作 list.append(x) list.extend(L) list.insert(index,x) list.rem ...

  8. python学习笔记:python序列

    python序列包括字符串.列表和元组三部分,下面先总的说一下python序列共有的一些操作符和内建函数. 一.python序列 序列类型操作符 标准类型的操作符一般都能适用于所有的序列类型,这里说一 ...

  9. Python序列结构--字典

    字典:反映对应关系的映射类型 字典(dict)是包含若干“键:值”元素的无序可变序列 字典中元素的“键”可以是python中任意不可变数据,例如整数.实数.复数.字符串.元组等类型可哈希数据,“键”不 ...

随机推荐

  1. MFC学习单选框Radio使用

    创建单选框Radio ,ID号IDC_RADIO_NAME 1.获取单选框内容 int RadioState = ((CButton *)GetDlgItem(IDC_RADIO_NAME))-> ...

  2. 解决使用Foxmail客户端软件不能收取腾讯企业邮箱的全部邮件

    一般说来,使用Foxmail客户端软件收取邮箱时,需要作如下几步: 1.进入邮箱web界面授权开启POP3/SMTP服务.IMAP/SMTP等服务 2.在邮箱web界面配置收取选项,可选择收取全部邮件 ...

  3. 使用python语言操作MongoDB

    MongoDB是一个跨平台的NoSQL,基于Key-Value形式保存数据.其储存格式非常类似于Python的字典,因此用Python操作MongoDB会非常的容易. pymongo的两种安装命令 p ...

  4. 访问php文件显示源码

    前天新装了个LAMP的环境,兴冲冲的clone下来代码,结果一访问乐子就大了,直接显现源码 面对这个问题,冥思苦想,四处找资料啊 让我改这改那的,最后终于找到症结 Ubuntu 16.04 系统 LA ...

  5. CCCC L2-007. 家庭房产 建图 XJB模拟

    https://www.patest.cn/contests/gplt/L2-007 题解:一开始是想直接并查集,一个家就是一个集合,对每个集合维护一个人数num1一个房产数num2 一个房产面积ar ...

  6. MongoDB的”存储过程“

    使用 db.system.js.insert({_id:"aaa", value:"zzq"}); 这条命令向全局系统的js中添加了一个_id为"aa ...

  7. HandlerThread分析

    Handy class for starting a new thread that has a looper. The looper can then be used to create handl ...

  8. 快捷键(SourceInsight)

    选择一块 : Ctrl+-选择一行 : Shift+F6到下一个函数 : 小键盘 +上一个函数 : 小键盘 -高亮当前单词 : Shift+F8回退.前进 alt + , alt + .最后一个窗口 ...

  9. chown 命令

    root@localhost ~]# .txt # 同时修改文件属主和属组 !chown 执行上一个chown命令

  10. PHP移动互联网开发笔记(6)——MySQL数据库基础回想

    近期看了一些架构方面的资料.可是发现基础知识都不怎么坚固,接下来的一段时间.我会定期总结基础知识. 一.数据类型   1.整型   数据类型 存储空间 说明 取值范围 TINYINT 1字节 很小的整 ...