python中set去重注意事项

    xiaoxiao2025-08-05  14

    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时要格外小心。

    转载请注明原文地址: https://ju.6miu.com/read-1301430.html
    最新回复(0)