数据去重

数据去重的两种方式

第一种:不考虑顺序,数据去重

通过集合的方式:

>>> a
[1, 5, 2, 1, 9, 1, 5, 10]
>>> set(a)
{1, 2, 10, 5, 9}
>>>

通过字典的键的方式:

>>> a = [1,2,2,2,3]
>>> b = {}.fromkeys(a).keys()
>>> b
dict_keys([1, 2, 3])
>>>

第二种:考虑顺序,数据去重

如果序列上的值都是 hashable 类型,那么可以很简单的利用集合或者生成器来解决这个问题

def dedupe(items):
    seen = set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

if __name__ == "__main__":        
    a = [1, 5, 2, 1, 9, 1, 5, 10]
    b = list(dedupe(a))
    print(b)
    #结果为[1, 5, 2, 9, 10]

如果消除元素不可哈希(比如 dict 类型)的序列中重复元素

def dedupe(items, key=None): 
#key参数指定了一个函数,将序列元素转换成 hashable 类型
    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)
if __name__ == "__main__":
    a = [ {'x':1, 'y':2}, {'x':1, 'y':3}, {'x':1, 'y':2}, {'x':2, 'y':4}]

    b = list(dedupe(a, key=lambda d: (d['x'],d['y'])))
    print(b)
    # b 的结果值为[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 2, 'y': 4}]

    c = list(dedupe(a, key=lambda d: d['x']))
    print(c)
    # c 的结果值为[{'x': 1, 'y': 2}, {'x': 2, 'y': 4}]

文本数据去重

读取一个文件(csv文件、execl文件等等),消除重复行
第一种方式:

with open(somefile,'r') as f:
    for line in dedupe(f):
        print(line)

第二种方式:

distinct_data = open(r'distinct_data.csv','w') #去重后的文件
with open(r'origin.csv','r').readlines() as f: #未去重的文件
    for line in {}.fromkeys(f).keys():
    print(line[0])
    #print(line)
    distinct_data.writelines(line)
distinct_data.close()

参考文档:http://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p10_remove_duplicates_from_seq_order.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值