【Python练习圣典】序列高级操作

系统 1497 0

不管顺序的去重转为set即可

1.将序列中重复元素去除,并保持顺序

            
              #如果序列items中的值是可哈希的
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]

写成函数形式是使程序更通用,如读文件去除重复行:

            
              with open(somefile,'r') as f:
    for line in dedupe(f):
        ...
            
          
            
              # 如果序列items中的值是不可哈希-这个更通用,也支持可哈希序列
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)
            
          

>>> 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}]

其中,key是一个从不可哈希值转为可哈希值的函数,并按key()的返回值去重,若值已经可哈希,则令key=None

                                                                                                                                                                                                          

hashable -- 可哈希

一个对象的哈希值如果在其生命周期内绝不改变,就被称为  可哈希  (它需要具有  __hash__()  方法),并可以同其他对象进行比较(它需要具有  __eq__()  方法)。可哈希对象必须具有相同的哈希值比较结果才会相同。

可哈希性使得对象能够作为字典键或集合成员使用,因为这些数据结构要在内部使用哈希值。

大多数 Python 中的不可变内置对象都是可哈希的;可变容器(例如列表或字典)都不可哈希;不可变容器(例如元组和 frozenset)仅当它们的元素均为可哈希时才是可哈希的。 用户定义类的实例对象默认是可哈希的。 它们在比较时一定不相同(除非是与自己比较),它们的哈希值的生成是基于它们的  id()

List

            
               x = [1,2,3]
 y = {x: 9}#生成字典y报错
  Traceback (most recent call last):
   File "
              
                ", line 1, in 
                
                  
 TypeError: unhashable type: 'list'
                
              
            
          

Tuple

            
              z = (5,6)
y = {z: 89}
print(y)
{(5, 6): 89}
            
          

 

                                                                                                                                                                                                          

yield详解:

https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html

https://www.jianshu.com/p/d09778f4e055

https://blog.csdn.net/dcrmg/article/details/78128041 

                                                                                                                                                                                                          


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论