1. 程式人生 > >基礎數據類型之集合和深淺copy,還有一些數據類型補充

基礎數據類型之集合和深淺copy,還有一些數據類型補充

去重 不可變 blog 而是 ron 之間 key 哈希 內存

                      集合

集合是無序的,不重復的數據集合,它裏面的元素是可哈希的(不可變類型),但是集合本身是不可哈希(所以集合做不了字典的鍵)的。以下是集合最重要的兩點:

  去重,把一個列表變成集合,就自動去重了。

  關系測試,測試兩組數據之前的交集、差集、並集等關系。

技術分享圖片

#關於集合和波爾值之間的茍茍且且
# set ={1,2,3,4,5,True,(1,2,3),} #集合具有自動去重和去空格功能
# set.add(False)
# set.add(True) #打印結果顯示,沒有Teue,應該是集合內部的數字和元組不是空是True,去重就把True去掉了
# print(set)

# set.update(False) #update是隨機叠代增加,布爾值不是叠代對象,所以只能用add增加
# print(set)
# set.update(True)
# print(set)

#刪除
# set = {1,2,3,4,5,(789),6}
# set.pop() #隨機刪除,有返回值
# print(set)

#交集
# set = {1,2,3,4}
# set1 = {3,4,5,6,7}
# print(set.intersection(set1))
# print(set&set1)

#並集 並集也可以去兩個集合的重
# set = {1,2,3,4}
# set2 = {3,4,5,6,7,8}
# print(set.union(set2))
# print(set|set2)

#差集
# set = {1,2,3,4,5}
# set3 = {4,5,6,7}
# print(set.difference(set3))
# print(set - set3)

#反交集 #兩個集合相同的去掉
# set = {1,2,3,4,5}
# set4 = {4,5,6,7,8}
# print(set.symmetric_difference(set4))
# print(set ^ set4)

#超集 子集
# set = {1,2,3,4}
# set5 = {1,2,3,4,5,6,7}
# print(set5.issuperset(set)) #判斷set5是不是set的爸爸,返回波爾值
# print(set.issubset(set5)) #判斷set是不是set5的兒子,返回波爾值
# print(set5 > set)
# print(set < set5)

#把集合凍住,使其成為不可變數據類型
# set = {1,2,3,4,5,6}
# print(frozenset(set))

深淺copy

淺copy 通過賦值之後,兩個值內存地址不同,在數據有嵌套的情況下,嵌套部分內存地址相同,無論嵌套多少層都一樣

深copy必須調用copy模塊才能使用 import copy deepcopy 深copy就是通過賦值之後,值得內存地址完全不同,無論嵌套多少層都一樣

基礎數據類型補充

現在我莫名其妙有一個需求dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘a3‘:‘v3‘},我現在看著字典不順眼,準備收拾它,就想著把它的帶元素k的鍵刪掉怎麽辦

按照正常思路來一下,這個字典有多大咱們不知道,也許裏面儲存了上億的帶k大軍,所以我用循環刪

dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘a3‘:‘v3‘}

for i in dic:

  if ‘k‘ in i:

    del dic[i]

print(dic)

結果報錯,說是字典長度改變了。。。我覺得廢話,我要刪除長度肯定改變啊,總之不讓刪咋整。。。

然後,我踩在前人的肩膀上抄了這樣一份代碼解決了問題

# dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘a3‘:‘v3‘}
# l = []
# for i in dic:
# if ‘k‘ in i:
# l.append(i)
# for i in l: #關鍵在這裏和下面,執行的是循環列表,但是刪除的是字典,無恥啊
# del dic[i] #現在字典可以刪除,因為現在不是邊循環字典邊刪除,而是先判斷出字典的帶k大軍放到列表裏,循環列表就相當於循環字典帶k大軍,此時字典的帶k大軍就被刪除了
# print(dic)
然後我又抄了第二份。。。
# dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘a3‘:‘v3‘}
# dic1 = {}
# for i in dic.keys():
# if ‘k‘ not in i:
# dic1.setdefault(i,dic[i])
# dic = dic1
# print(dic)


經過我一些神神叨叨的實驗,得出以下結論

列表
當循環列表時,如果在循環中刪除某個或者某些元素,列表元素個數改變,索引改變,容易出錯。
列表這個在循環刪除的時候可以從後往前刪除,這樣前面的索引不會變化,至於後面的那就無所謂了,後面改變也不影響循環

字典
當循環字典時,如果在循環中刪除某個或者某些鍵值對,字典的鍵值對個數改變,長度改變,容易出錯。

基礎數據類型之集合和深淺copy,還有一些數據類型補充