python中set去重注意事项

python中set结构是 唯一的可被哈希的(hashable)对象(object)的无序的集合。也就是说set内的元素必须是可被哈希的。

有时候我们需要使用set结构来检测两个列表或其它的数据类型的元素差异。如下:

m1=[1,2,3]
m2=[2,3,4]
m=set(m1)-set(m2)
print(m)
输出结果为:set([1])

上面的代码 使用m1和m2初始化两个set对象,然后利用其-操作符,来计算在m1中但是没有在m2中的元素,于是结果输出为1。

上面的代码是没问题的,以为m1,m2是可以被哈希运算后,计算唯一性。

如果m1 m2中元素是不可被hash的,例如list,dict,tuple等,则set()转换的时候会报错。如下:

m1=[1,2,3,[1,2,3]]
print(set(m1))
File "C:/Python27/Lib/site-packages/vistek_device_service/teexy.py", line 13, in <module>
    print(set(m1))
TypeError: unhashable type: 'list'
应用举例:

检测多个设备的运行状态,线程间隔从设备服务中获取设备列表,获取新设备后,检查增加,删除,状态改变的设备。因此需要检测新获取的设备列表和上次获取到的设备列表的变化。

但是问题是获取到的设备列表是list类型,但是list内的元素类型是class对象,此时就想通过set类型检测设备的变化,但是这样还有问题,我们来模仿一个列子:

class a():
    def __init__(self,id,age):
        self.device_id=id
        self.device_name=name
object1=a("23333",'c1')
object2=a("23333",'c1')
c=[object1]
b=[object2]
print(set(c)-set(b))
C:\Python27\python.exe C:/Python27/Lib/site-packages/vistek_device_service/teexy.py
set([<__main__.a instance at 0x0000000003393708>])


我们期望的结果是print返回为空。但是实际情况并没有如愿。

因此再使用set时要格外小心。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值