Python: 序列list:保持元素顺序同时消除重复值

问题:怎样在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为基础设计的

转载于:https://www.cnblogs.com/baxianhua/p/8117030.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值