日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集合与深浅拷贝

發布時間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集合与深浅拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要內容:

一. 基礎數據類型補充

  1> ?join

li = ["李嘉誠", "麻花藤", "黃?峰", "劉嘉玲"] s = "_".join(li) #把 _ 插入到 li 列表中;可以把列表變成字符串print(s) li = "黃花大閨女"s = "_".join(li) #把 _ 插入到字符串中;把字符串變成列表,可用split()切割.print(s)

  2> ?列表:

    循環刪除列表中每一個元素.

li = [11, 22, 33, 44] for e in li:li.remove(e) print(li) #結果: [22, 44]

    分析原因: ? for的運行過程,會有一個指針來記錄當前循環的元素是哪一個, 一開始這個指針指向第0 個. 然后獲取到第0個元素. 緊接著刪除第0個. 這個時候.

    原來是第1個的元素會自動的變成第0個. 然后指針向后移動一次, 指向1元素. 這時原來的1已經變成了了0, 也就不會被刪除了. ??

    其他刪除方法:

    del 循環刪除:

li = [11, 22, 33, 44]for i in range(0, len(li)):del li[i] print(li)#結果: 報錯i= 0, 1, 2 刪除的時候li[0] 被刪除之后.后面一個就變成了第0個.以此類推. 當i = 2的時候.list中只有一個元素.但是這個時候刪除的是第2個肯定報錯啊

    pop循環刪除

    for el in li:li.pop() # pop也不行 print(li) #結果: [11, 22] 不能全部刪除.

    正確循環的全部刪除方式

    for i in range(0, len(li)): # 循環len(li)次, 然后從后往前刪除   li.pop() print(li)#結果:[] 此方式可行. li = [11, 22, 33, 44] del_li = [] #先聲明一個列表for e in li:del_li.append(e) #把要刪除的對象存入該列表中for e in del_li:li.remove(e) #遍歷該列表,并在 li 列表中依次刪除要刪除的對象.print(li)#結果 [] 此方式可行.

   注意: 由于刪除元素會導致元素的索引改變, 所以容易易出現問題. 盡量不要再循環中直接去刪 除元素. 可以把要刪除的元素添加到另一個集合中然后再批量刪除

?  3> ?dict中的fromkey(),可以幫我們通過list來創建一個dict

dic = dict.fromkeys(["jay", "JJ"], ["周杰倫", "麻花藤"]) print(dic)# 結果: {'jay': ['周杰倫', '麻花藤'], 'JJ': ['周杰倫', '麻花藤']}

    前面列表中的每一項都會作為key, ?后面列表中的內容作為value,生成dict.?

    注意:

dic = dict.fromkeys(["jay", "JJ"], ["周杰倫", "麻花藤"]) print(dic) dic.get("jay").append("胡大")
  
     print(dic) #結果: {'jay': ['周杰倫', '麻花藤', '胡大'], 'JJ': ['周杰倫', '麻花藤', '胡大']}

    代碼中只是更改了jay那個列表. 但是由于jay和JJ用的是同一個列表. 所以前面那個改了. 后面那個也會跟著改.

  4> ?dict中的元素在迭代過程中是不允許進行刪除的 ,只能把要刪除的元素暫時先保存在一個list中, 然后循環list, 再刪除 .

?

    dic = {'k1': 'alex', 'k2': 'wusir', 's1': '金老板'} dic_del_list = [] # 刪除key中帶有'k'的元素 for k in dic:if 'k' in k:dic_del_list.append(k) for el in dic_del_list:del dic[el] print(dic)

  5> ?類型轉換:

    元組 => 列表 ? ? ? ?list(tuple)

    列表 => 元組 ? ? ? ?tuple(list)

    list=>str? ?    str.join(list)    #見例題 1> 中join內容.

    str=>list ? ?   str.split()

    轉換成False的數據:

    0, ' ', None , [], (), {}, set() ==> False    #只要是空,就是False

二. set集合?

  1> set集合是python的一個基本數據類型. 一般不是很常用. set中的元素是不重復的.無序的.里面的元素必須是可hash的(int, str, tuple,bool), 我們可以這樣來記,

  set就是dict類型的數據但是不保存value, 只保存key. set也用{}表示 .

  2> 注意: set集合中的元素必須是可hash的, 但是set本身是不可hash得, set是可變的.

set1 = {'1','alex',2,True,[1,2,3]} # 報錯 set2 = {'1','alex',2,True,{1:2}} # 報錯 set3 = {'1','alex',2,True,(1,2,[2,3,4])} # 報錯

  3> set中的元素是不重復的, 且無序的.

s = {"周杰倫", "周杰倫", "周星星"} print(s) 結果: {'周星星', '周杰倫'}#使用這個特性.我們可以使用set來去掉重復 # 給list去重復 lst = [45, 5, "哈哈", 45, '哈哈', 50] lst = list(set(lst)) # 把list轉換成set, 然后再轉換回list print(lst)

  4> set集合增刪改查

    增加

s = {"劉嘉玲", '關之琳', "王祖賢"} s.add("鄭裕玲") print(s) s.add("鄭裕玲") # 重復的內容不會被添加到set集合中 print(s) s = {"劉嘉玲", '關之琳', "王祖賢"} s.update("麻花藤") # 迭代更新 print(s) #結果 {'麻', '劉嘉玲', '花', '關之琳', '王祖賢', '藤'} s.update(["張曼玉", "李若彤","李若彤"]) print(s)#結果 {'劉嘉玲', '李若彤', '張曼玉', '王祖賢', '關之琳'}

    刪除

    s = {"劉嘉玲", '關之琳', "王祖賢","張曼玉", "李若彤"} item = s.pop() # 隨機刪除一個. print(s) print(item) s.remove("關之琳") # 直接刪除元素 # s.remove("馬虎疼") # 不存在這個元素. 刪除會報錯 print(s) s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出來set() 因為要和dict區分的. print(s) # set()

   修改

# set集合中的數據沒有索引,也沒有辦法去定位一個元素. 所以沒有辦法進行直接修改. #我們可以采用先刪除后添加的方式來完成修改操作 s = {"劉嘉玲", '關之琳', "王祖賢","張曼玉", "李若彤"} # 把劉嘉玲改成趙本山 s.remove("劉嘉玲") s.add("趙本山") print(s)

   查詢

# set是一個可迭代對象. 所以可以進行for循環 for el in s: print(el)

  5> 常用操作

    s1 = {"劉能", "趙四", "皮長山"} s2 = {"劉科長", "馮鄉長", "皮長山"} # 交集 # 兩個集合中的共有元素 print(s1 & s2) # {'皮長山'} print(s1.intersection(s2)) # {'皮長山'} # 并集print(s1 | s2) # {'劉科長', '馮鄉長', '趙四', '皮長山', '劉能'} print(s1.union(s2)) # {'劉科長', '馮鄉長', '趙四', '皮長山', '劉能'} # 差集 print(s1 - s2) # {'趙四', '劉能'} 得到第一個中單獨存在的 print(s1.difference(s2)) # {'趙四', '劉能'} # 反交集 print(s1 ^ s2) # 兩個集合中單獨存在的數據 {'馮鄉長', '劉能', '劉科長', '趙四'} print(s1.symmetric_difference(s2)) # {'馮鄉長', '劉能', '劉科長', '趙四'} s1 = {"劉能", "趙四"} s2 = {"劉能", "趙四", "皮長山"} #子集 print(s1 < s2) # set1是set2的子集嗎? True print(s1.issubset(s2)) # 超集 print(s1 > s2) # set1是set2的超集嗎? False
print(s1.issuperset(s2))

  set集合本身是可以發生改變的. 是不可hash的. 我們可以使用frozenset來保存數據. frozenset是不可變的. 也就是一個可哈希的數據類型?

s = frozenset(["趙本山", "劉能", "皮長山", "長跪"]) dic = {s:'123'} # 可以正常使用了 print(dic)

三. 深淺拷貝

  1> 賦值

  

lst1 = ["金毛獅王", "紫衫龍王", "白眉鷹王", "青翼蝠王"] lst2 = lst1 print(lst1) print(lst2) lst1.append("楊逍") print(lst1) print(lst2) 結果: ['金毛獅王', '紫衫龍王', '白眉鷹王', '青翼蝠王', '楊逍'] ['金毛獅王', '紫衫龍王', '白眉鷹王', '青翼蝠王', '楊逍']dic1 = {"id": 123, "name": "謝遜"} dic2 = dic1 print(dic1) print(dic2) dic1['name'] = "范瑤" print(dic1) print(dic2) 結果: {'id': 123, 'name': '謝遜'} {'id': 123, 'name': '謝遜'} {'id': 123, 'name': '范瑤'} {'id': 123, 'name': '范瑤'}

    對于list, set, dict來說, 直接賦值. 其實是把內存地址交給變量. 并不是復制一份內容. 所以. lst1的內存指向和lst2是一樣的. lst1改變了了, lst2也發生了了改變.

  2> 淺拷貝

lst1 = ["何炅", "杜?濤","周渝民"] lst2 = lst1.copy() lst1.append("李嘉誠") print(lst1) print(lst2) print(id(lst1), id(lst2)) 結果: 兩個lst完全不一樣. 內存地址和內容也不一樣. 發現實現了內存的拷貝 ,copy 相當于把lst1中的元素(對象)完全復制一份lst2,內存地址不一樣,操作也互不相關.lst1 = ["何炅", "杜?濤","周渝民", ["麻花藤", "馬蕓", "周筆暢"]] lst2 = lst1.copy() #lst1 列表中的lst1[3]是個列表,copy過程中不會復制lst1[3]中的元素,只是復制他的內存地址.lst1[3].append("無敵是多磨寂寞") #添加的過程是:在lst1中找到lst1[3]的內存地址,由內存地址找到要添加的列表元素.print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 結果:['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多磨寂寞']]['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多磨寂寞']]4417248328 4417248328

    注意:淺拷貝. 只會拷貝第一層. 第二層的內容不會拷貝. 所以被稱為淺拷貝.

  3> 深拷貝

import copylst1 = ["何炅", "杜海濤","周渝民", ["麻花藤", "馬蕓", "周筆暢"]] lst2 = copy.deepcopy(lst1) lst1[3].append("無敵是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 結果: ['何炅', '杜海濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢', '無敵是多磨寂寞']] ['何炅', '杜?濤', '周渝民', ['麻花藤', '馬蕓', '周筆暢']] 4447221448 4447233800

    注意:深度拷貝. 把元素內部的元素完全進行拷貝復制. 不會產生一個改變另一個跟著改變的問題

?

轉載于:https://www.cnblogs.com/panda-pandeyong/p/9290078.html

總結

以上是生活随笔為你收集整理的集合与深浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。