1. 程式人生 > >python中set去重注意事項

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