python cookbook 1.10从序列中移除重复项且保持元素间顺序不变

#1.10从序列中一处重复项且保持元素间顺序不变
def dedupe(items):      
    seen = set()    #若序列中的值是可哈希的(不可变,整数浮点数字符串元组),那么这是可通过集合和生成器解决
    for item in items:
        if item not in seen:
            yield item   #每次返回一个不再seen中的元素,其实就相当于返回给了调用外面的list,list是有插入顺序关系的`       
            seen.add(item)
        
a = [1,2,6,4,1,2,9,4,9]
print(list(dedupe(a)))

#在不可哈希对象中去除重复项,稍作修改即可
def dedupe(items,key=None):   #key的作用是指定一个函数用来将序列中元素转换为可哈希类型,这么做目的是为了检测重读对象
    seen = set()
    for item in items:
        val = item if item 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}]
print(list(dedupe(a,key=lambda d:(d['x'],d['y']))))   #d['x']相等且d['y']相等
print(list(dedupe(a,key=lambda d:d['x'])))    #只按d['x']进行筛选

#若只是为了去除重复项,不考虑元素顺序的话,可以直接用set()
a = [11,1,2,6,4,1,2,9,4,9,7,8,3,3,2,1]
b="231431432564362434262"
print(set(a))
print(set(b))   #输出无序,不能保证元素间的顺序不变,得到的结果会被打乱。前面方法可避免这个问题

#集合的特点就是集合中的元素都是唯一的,但不保证他们之间的顺序
a=set()
a.add(10)
a.add(1)
a.add(5)
print(a)

#若想读一个文件,去除其中重复文本行,可这样
with open(somefile,'r') as f:
    for line in dedupe:
        ...

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值