目錄
介紹
列表(List)
集合(Set)
字典(Dict)
元組(Tuple)
列表
列表定義
?編輯?列表切片
列表常用方法?
append
extend
?編輯?insert
?編輯?remove
pop?
?編輯?clear
?編輯?列表修改元素
?sort
升序
倒序
reverse
?count
?編輯?index
淺拷貝和深拷貝
淺拷貝
深拷貝
?兩者區別
列表的加法和乘法
加法
乘法?
列表推導式
元組
元組與列表的區別
舉例
打包和解包?
元組打包
元組解包
擴展解包
字典
定義
創建字典的六種方式
直接使用{}進行定義
dict定義?
列表元組方式定義?
不知道怎么描述的定義╮(╯▽╰)╭??
?混合定義
zip定義
formkeys增加字典鍵值對
pop刪除字典元素?
?編輯?popitems 刪除字典中最后一個鍵值對
del 刪除鍵值?
clear 清空字典?
?編輯get 獲取鍵值元素
獲取字典的視圖對象?
拿取字典鍵值長度和判斷鍵值是否存在?
字典推導式?
集合
set 可變集合
創建集合
集合的基本操作
集合的去重示例
集合推導式?
frozenset 不可變集合
創建?frozenset
特點
應用場景
示例
介紹
在Python中,列表(List)
、集合(Set)
、字典(Dict)
和元組(Tuple)
是四種基礎且重要的數據結構,它們各有特點和適用場景:
列表(List)
優點:
- 有序性:列表中的元素按照插入的順序排列,支持索引訪問。
- 靈活性:可以動態添加、修改或刪除元素,適合用于需要頻繁變更的數據集合。
- 異構性:可以容納不同類型的元素,如整數、字符串、對象等。
區別: 與其他三種相比,列表的主要區別在于其可變性和異構性,但這也使得它在某些情況下不如集合或字典高效。
集合(Set)
優點:
- 唯一性:自動去除重復元素,適合用于需要確保元素唯一性的場景。
- 高效查找:基于哈希表實現,提供了快速的成員測試和交、并、差等集合運算。
- 無序性:不保證元素的順序,適合于對順序不敏感的數據處理。
區別: 集合的獨特之處在于其唯一性和無序性,適用于需要快速查找和處理無序數據集合的情況。
字典(Dict)
優點:
- 鍵值對:通過鍵(必須唯一)快速訪問值,提供高效的映射關系存儲。
- 靈活性:鍵可以是幾乎任何不可變類型,支持動態添加、修改鍵值對。
- 無序性:雖然Python 3.7+中字典保持了插入順序,但本質上字典是無序的。
區別: 字典的核心優勢在于鍵值映射,適合構建復雜的數據結構,如緩存、配置等。
元組(Tuple)
優點:
- 不可變性:一旦創建,元素便不可更改,這有助于保護數據免受意外修改。
- 輕量級:相比于列表,元組在內存占用上更小,因為它是靜態數據結構。
- 可作為字典鍵:由于其不可變性,元組可以直接作為字典的鍵使用。
區別: 元組的主要特征是不可變性和輕量級,適用于不需要修改的固定數據集合,如函數返回多個值的場景。
列表
列表定義
python的列表使用[] 進行數據定義,列表有序并且可以包含不同的數據類型
進行for循環打印元素
還可以使用列表推導式進行比較優雅的打印
?列表索引是從0開始的
或者倒序取最后一個元素,倒序取最后一個元素是以-1,-2,-3這樣進行排序
?列表切片
python支持使用列表切片進行數據拿取
左側閉區間,右側是開區間
?
還可以進一步進行化簡,從頭開始那么頭可以省略,到結尾結束,那么結尾也可以省略
?還可以進行跨度取值 再添加一個冒號,冒號后設置跨度步長
?前面是從開始到結尾那么開始到結尾也可以省略
還可以使用切片進行倒序輸出
?
列表常用方法?
append
添加一個元素到列表末尾
列表名.append(元素)
當然也可以使用切片來進行元素添加
注意 append方法每次只能添加一個元素 當我們想要一次性添加多個元素時可以使用extend方法
extend
一次性添加多個元素到列表末尾
列表名.extend(可迭代對象)
?
extend當然也可以使用切片優雅的實現
?insert
在列表的任意位置插入數據
列表名.insert(插入的索引,元素)
?remove
刪除列表中第一個符合條件的元素
列表名.remove(元素)
?注意
?
pop?
刪除指定下標元素
列表名.pop(下標索引)
?clear
清空列表元素
列表名.clear()
?列表修改元素
列表是可變的,可以進行任意元素的修改
列表名[下標索引] = 重新賦值元素
?或者使用切片進行多個元素修改,左側閉區間(包含)
?sort
升序
列表數字元素默認升序排列
倒序
reverse
列表數字元素倒序排列
踩坑注意 reverse倒序必須在sort方法先升序排列后再調用倒序,不然會亂序:
?count
返回列表中指定元素的數量
列表名.count(元素)
?index
返回指定元素的索引
淺拷貝和深拷貝
在Python中,列表的淺拷貝和深拷貝是兩種不同的復制列表數據結構的方式,它們在處理嵌套列表(即列表中包含其他列表)時表現出不同的行為。
淺拷貝
淺拷貝會創建原列表的一個副本,但是這個副本中的元素如果本身是可變對象(如子列表),那么這些元素不會被真正復制,新列表中的這些元素會引用原列表中相同對象的內存地址。換句話說,淺拷貝只拷貝一層,子對象仍然是引用。
然后我們更改lie的元素數據,查看lie2會有什么變化
說明lie2此時的拷貝是引用拷貝的淺拷貝
深拷貝
深拷貝則會遞歸地復制列表及其所有子對象,創建一個完全獨立的新列表。這意味著修改原列表或其子列表不會影響到通過深拷貝得到的新列表。
?兩者區別
- 淺拷貝僅復制頂級元素,如果元素是可變對象(如列表、字典等),則拷貝的是這些對象的引用而非實際對象的內容。
- 深拷貝不僅復制頂級元素,還會遞歸地復制所有子元素,確保原列表和拷貝的列表在內存中是完全獨立的,修改一個不會影響另一個。
根據實際需求選擇合適的拷貝方式:如果列表中不包含或者不需要關心可變對象的獨立性,淺拷貝可能更高效;反之,如果需要完全獨立的復制品,應使用深拷貝。
列表的加法和乘法
加法
兩個列表之間可以直接進行相加從而形成一個整體
乘法?
列表的乘法是直接將列表中的元素進行乘法復制
列表推導式
?列表在書寫時可以使用列表推導式來替代原先的for循環寫法,且執行速度比for循環更快,因為列表推導式是使用底層c語言來執行的
左側是表達式,右側是循環元素
循環右側還可以進行篩選條件的書寫
元組
Python的元組(Tuple)是一種不可變的序列類型,它與列表(List)相似,可以存儲多個有序的數據項,但元組一旦創建后就不能修改其內容。元組通常用于存儲一些固定的數據集合,比如日期、坐標點等,當不需要改變這些數據時,使用元組可以提供更好的性能和安全性。
元組與列表的區別
-
可變性:
- 列表是可變的,意味著你可以對列表進行增刪改操作,如
append()
,?extend()
,?insert()
,?remove()
等方法。 - 元組是不可變的,一旦創建,你不能更改或刪除其中的元素。這使得元組更加安全,因為它們的值不會意外改變。
- 列表是可變的,意味著你可以對列表進行增刪改操作,如
-
性能:
- 因為元組的不可變性,訪問元組的速度通常比列表快,尤其是在大數據量的情況下,元組的處理更加高效。
-
語法:
- 列表用方括號
[]
表示,如[1, 2, 3]
。 - 元組用圓括號
()
表示,如(1, 2, 3)
。
- 列表用方括號
舉例
元組的逗號非常重要,兩邊的括號可以省略
創建只有一個元素的元組
?元組也可以使用列表推導式和切片
打包和解包?
在Python中,元組的“打包”(packing)和“解包”(unpacking)是處理元組時的兩個重要概念,它們幫助我們更靈活地操作數據。
元組打包
打包是指將多個值合并成一個元組的過程。實際上,當你直接列出一系列由逗號分隔的值,并用圓括號包圍它們時,就已經在進行元組打包了。例如:
Python
1coordinates = (3, 4) # 這里,3和4被"打包"成一個元組
在這個例子中,數字3和4通過逗號連接并用圓括號包圍,形成了一個包含兩個元素的元組。
元組解包
解包則是將元組中的元素分配給單獨的變量的過程。這可以通過將元組放在等號左側,然后是一系列與元組元素數量相等的變量名來實現,每個變量接收元組中的一個元素。例如:
Python
1x, y = coordinates # 這里,元組"coordinates"被"解包"到變量x和y中
上面的代碼中,coordinates
元組的兩個元素分別被賦值給了變量x
和y
,這就是元組解包。
擴展解包
Python還支持一種稱為“擴展解包”的操作,使用星號*
來收集多余的項為一個新的元組(或列表)。這對于處理不定長的參數列表特別有用。例如:
Python
a, b, c = (1, 2, 3) # 這里,a=1, b=2, c=3,
在這個例子中,a
接收第一個元素,b接受第二個
元素。?c
接收最后一個元素,
1a, *b, c = (1, 2, 3, 4, 5) # 這里,a=1, c=5, b=(2, 3, 4)
在這個例子中,a
接收第一個元素,c
接收最后一個元素,而b
作為一個新的元組接收剩余的所有元素。
注意 賦值號左邊的變亮名數量和右側序列的數量一定要一致,不然會報錯
元組的打包和解包機制為Python編程提供了強大的靈活性,特別是在處理函數參數、返回值以及數據交換等方面。
字典
定義
Python的字典(Dictionary)是一種可變的、無序的、鍵-值對(key-value pair)的數據結構。字典中的每個元素都是一個鍵值對,其中鍵(key)是唯一的,不可變的(通常為字符串、數字或元組),用于快速查找對應的值(value),值可以是任何類型的對象。字典用花括號{}
表示,鍵值對之間用逗號,
分隔。
創建字典的六種方式
直接使用{}進行定義
dict定義?
注意dict進行定義字典時,字典的key不要加引號
列表元組方式定義?
不知道怎么描述的定義╮(╯▽╰)╭??
?感覺有點脫褲子放屁的味道
?混合定義
zip定義
?
formkeys增加字典鍵值對
創建一個初始化鍵值的value都相同的字典
第一個參數傳入可迭代對象,第二個參數傳入value值,就可以初始化這個字典所有的鍵的value值都相同的字典
當想要修改字典的值時可以直接使用 下面的方式進行修改
或者初始化一個沒有vaule的字典
?
pop刪除字典元素?
pop可以對字典值進行彈出刪除
如果刪除一個字典中本就不存在的鍵會報錯
避免這樣的錯誤可以傳入第二個參數進行默認提示
?popitems 刪除字典中最后一個鍵值對
python3.7之前字典是無序的,popitems是隨機刪除一個字典的鍵值,在3.7之后是刪除最后一個鍵值對
del 刪除鍵值?
或者可以使用del來對字典鍵值進行刪除
clear 清空字典?
使用clear方法對字典鍵值進行清空
get 獲取鍵值元素
之前可以直接使用 字典名['鍵名']? 來獲取value值,但是當鍵值不存在字典里面的時候就會報錯
get可以獲取鍵值元素,當字典中沒有要獲取的鍵值時,可以傳入一個默認值來進行value的獲取
可以看到獲取的鍵值是不存在的但并沒有報錯,還可以傳入一個默認值,當鍵值不存在的時候返回傳入的默認值?
獲取字典的視圖對象?
當我們修改字典的鍵值value時觀察視圖對象的變化
?
拿取字典鍵值長度和判斷鍵值是否存在?
可以通過len函數來拿取字典的長度
使用in和not in來判斷字典是否包含某個鍵?
字典推導式?
字典也可以使用字典推導式
使用字典推導式可以很方便地將key和value進行反轉
?或者加上篩選條件,當value值大于100時才進行反轉
集合
set 可變集合
Python的集合(Set)是一種無序的、不重復的數據結構,用于存儲不同類型的唯一元素,如整數、浮點數、字符串等。集合支持數學集合運算,如并集、交集、差集等。集合用花括號{}
或內置函數set()
來創建,但當使用花括號時,如果元素之間沒有逗號分隔,會被解釋為字典的鍵值對。
創建集合
-
使用花括號:
1my_set = {1, 2, 3} # 創建一個集合
-
使用set函數:
1my_set = set([1, 2, 3]) # 從列表轉換成集合,自動去重
-
空集合:特別注意,空集合應該用
set()
而不是{}
,因為后者實際上創建的是一個空字典。1empty_set = set()
?
?
集合的基本操作
-
添加元素:使用
add()
方法。1my_set.add(4)
-
刪除元素:使用
remove()
方法(如果元素不存在會拋出錯誤),或者discard()
方法(不會拋錯)。1my_set.remove(7) # 如果7不存在,則拋出KeyError 2my_set.discard(7) # 如果7不存在,也不會報錯
-
集合的并集:使用
union()
方法或|
操作符。1set1 = {1, 2, 3} 2set2 = {3, 4, 5} 3union_set = set1.union(set2) # 或者 set1 | set2
-
集合的交集:使用
intersection()
方法或&
操作符。1intersection_set = set1.intersection(set2) # 或者 set1 & set2
-
集合的差集:使用
difference()
方法或-
操作符。1difference_set = set1.difference(set2) # 或者 set1 - set2
-
集合的對稱差集(不同時存在于兩個集合的元素):使用
symmetric_difference()
方法或^
操作符。1symmetric_diff_set = set1.symmetric_difference(set2) # 或者 set1 ^ set2
?
集合的去重示例
集合的一個重要特性就是自動去重,因此,如果你想去除一個列表中的重復元素,轉換為集合是一個非常簡便的方法。
1my_list = [1, 2, 2, 3, 4, 4, 5]
2unique_set = set(my_list) # 轉換為集合自動去重
3print(unique_set) # 輸出集合,元素順序可能與原列表不同
集合是Python中處理唯一元素集合時非常有用的數據結構,特別是涉及到集合運算和去重場景。
集合推導式?
集合也可以直接使用推導式
frozenset 不可變集合
frozenset
是 Python 中的一個不可變集合類型,它是集合 set
的不可變版本。與普通集合相比,frozenset
的元素一旦創建后就不能被修改,這意味著你不能向其中添加或刪除元素,也不能對集合進行更新。正因為它的不可變性,frozenset
可以作為字典的鍵或者作為其他集合的元素,這是普通集合做不到的。
創建?frozenset
1my_frozenset = frozenset([1, 2, 3])
2# 或者直接用花括號,但需確保元素間有逗號以區分
3my_frozenset = frozenset({1, 2, 3})
特點
- 不可變性:一旦創建,其內容就不能被改變。
- 哈希性:由于其不可變性,
frozenset
?是可哈希的,這意味著它可以作為字典的鍵或作為其他集合的元素。 - 集合操作:雖然不能直接修改,但仍支持并集、交集、差集等集合運算。
應用場景
- 當你需要將一個集合用作字典的鍵或其他集合的成員時,使用?
frozenset
?是必要的。 - 在多線程環境中,使用?
frozenset
?可以避免因集合內容突變而引發的并發問題。 - 當集合的內容需要作為常量或者在算法中作為不變的部分時,使用?
frozenset
?更為合適。
示例
1# 創建 frozenset
2fs1 = frozenset([1, 2, 3])
3fs2 = frozenset([3, 4, 5])
4
5# 集合運算依然可行
6union_fs = fs1.union(fs2)
7intersection_fs = fs1.intersection(fs2)
8
9print("Union:", union_fs) # 輸出: Union: frozenset({1, 2, 3, 4, 5})
10print("Intersection:", intersection_fs) # 輸出: Intersection: frozenset({3})
11
12# 嘗試修改 frozenset(會失敗,因為它是不可變的)
13# fs1.add(4) # 這會引發 AttributeError,因為 'frozenset' object has no attribute 'add'
總之,frozenset
提供了一種安全的方式來表示不可更改的集合數據,適用于那些需要集合特性的場景但又要求數據不可變的情景。