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是可以被哈希运算后,计算唯一性。
如果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
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时要格外小心。