Python列表,元組,集合,字典詳解一篇搞懂

目錄

介紹

列表(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)相似,可以存儲多個有序的數據項,但元組一旦創建后就不能修改其內容。元組通常用于存儲一些固定的數據集合,比如日期、坐標點等,當不需要改變這些數據時,使用元組可以提供更好的性能和安全性。

元組與列表的區別

  1. 可變性

    • 列表是可變的,意味著你可以對列表進行增刪改操作,如append(),?extend(),?insert(),?remove()等方法。
    • 元組是不可變的,一旦創建,你不能更改或刪除其中的元素。這使得元組更加安全,因為它們的值不會意外改變。
  2. 性能

    • 因為元組的不可變性,訪問元組的速度通常比列表快,尤其是在大數據量的情況下,元組的處理更加高效。
  3. 語法

    • 列表用方括號[]表示,如[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元組的兩個元素分別被賦值給了變量xy,這就是元組解包。

擴展解包

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()來創建,但當使用花括號時,如果元素之間沒有逗號分隔,會被解釋為字典的鍵值對。

創建集合

  1. 使用花括號

    1my_set = {1, 2, 3}  # 創建一個集合
  2. 使用set函數

    1my_set = set([1, 2, 3])  # 從列表轉換成集合,自動去重
  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 提供了一種安全的方式來表示不可更改的集合數據,適用于那些需要集合特性的場景但又要求數據不可變的情景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14937.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《書生·浦語大模型實戰營》第一課 學習筆記:書生·浦語大模型全鏈路開源體系

文章大綱 1. 簡介與背景智能聊天機器人與大語言模型目前的開源智能聊天機器人與云上運行模式 2. InternLM2 大模型 簡介3. 視頻筆記:書生浦語大模型全鏈路開源體系內容要點從模型到應用典型流程全鏈路開源體系 4. 論文筆記:InternLM2 Technical Report簡介軟硬件基礎…

基于Java的地震震中附近城市分析實戰

目錄 前言 一、空間數據說明 1、空間查詢 二、Java后臺開發 1、模型層設計與實現 2、控制層設計與實現 三、Leaflet地圖開發 1、地震震中位置展示 2、附近城市展示 3、成果展示 總結 前言 隨著全球氣候變化和地殼活動的不斷演變,地震作為一種自然災害&…

第十三節:帶你梳理Vue2 : watch偵聽器

官方解釋:> 觀察 Vue 實例變化的一個表達式或計算屬性函數。回調函數得到的參數為新值和舊值。表達式只接受監督的鍵路徑。對于更復雜的表達式&#xff0c;用一個函數取代<br/>## 1. 偵聽器的基本使用偵聽器可以監聽data對象屬性或者計算屬性的變化watch是觀察屬性的…

現代C++ 如何使用 Lambda 使代碼更具表現力、更容易理解?

使用 Lambda 使代碼更具表現力 一、Lambda VS. 仿函數二、總結 一、Lambda VS. 仿函數 Lambda 是 C11 中最引人注目的語言特性之一。它是一個強大的工具&#xff0c;但必須正確使用才能使代碼更具表現力&#xff0c;而不是更難理解。 首先&#xff0c;要明確的是&#xff0c;…

向npm發布自己寫的vue組件,使用vite創建項目

向npm發布自己寫的vue組件&#xff0c;使用vite創建項目 創建項目 pnpm create vite輸入項目名稱 由于我的組件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安裝了下面4個。 然后執行 pnpm i安裝依賴 vite.config.ts import { defineC…

防范TOCTOU競態條件攻擊

防范TOCTOU競態條件攻擊 在軟件開發過程中&#xff0c;我們常常會遇到需要在使用資源之前檢查其狀態的情況。然而&#xff0c;如果資源的狀態在檢查和使用之間發生了變化&#xff0c;那么檢查的結果可能會失效&#xff0c;導致軟件在資源處于非正常狀態時執行無效操作。這種時…

[datawhale202405]從零手搓大模型實戰:TinyAgent

結論速遞 TinyAgent項目實現了一個簡單的Agent智能體&#xff0c;主要是實現了ReAct策略&#xff08;推理調用工具的能力&#xff09;&#xff0c;及封裝了一個Tool。 項目實現有一定的疏漏。為了正確運行代碼&#xff0c;本次對代碼Agent部分進行了簡單修改&#xff08;完善…

windows安裝rocketmq

1.下載連接 https://rocketmq.apache.org/download/ 2.解壓到D盤下&#xff08;其他位置也可以&#xff09; 3.配置環境變量 需要有jdk環境 新建ROCKETMQ_HOME&#xff0c;剛剛解壓的位置 編輯Path&#xff0c;新增%ROCKETMQ_HOME%\bin 4.啟動mqnameserver 進入安裝bin目錄下…

ERC314協議

314協議功能詳解 這兩天花時間研究了一下314協議&#xff0c;總體感覺還不錯&#xff0c;有創新。 功能亮點 314協議作為一種創新的代幣標準&#xff0c;致力于降低用戶交易成本與簡化授權流程&#xff0c;通過“轉賬即交易”模式革新傳統Swap體驗。此協議簡化了買賣代幣的過程…

什么是react

React 是一個用于構建用戶界面的 JavaScript 庫&#xff0c;由 Facebook&#xff08;現在的 Meta&#xff09;開發和維護。它首次發布于2013年&#xff0c;并迅速成為最受歡迎的前端庫之一。React 的主要目標是提供一種高效、靈活的方式來構建用戶界面&#xff0c;特別是在大型…

gc和gccgo編譯器

Go 語言有兩個主要的編譯器&#xff0c;分別是 Go 編譯器&#xff08;通常簡稱為 gc&#xff09;和 GCCGO。它們之間有一些重要的異同點&#xff1a; gc 編譯器&#xff1a; gc 是 Go 語言的官方編譯器&#xff0c;由 Go 語言的開發團隊維護。它是 Go 語言最常用的編譯器&#…

PHP代碼審計前期準備

1 php代碼審計的意義 1.1 什么是代碼審計 就是獲取目標的代碼&#xff0c;這個目標可以是一個網站&#xff0c;也可以是一個手機app 1.2 黑盒測試與白盒測試的區別 在代碼審計中黑盒和白盒的主要區別就在于是否可以拿到源代碼&#xff0c;黑盒是拿不到源代碼的&#xff0c;…

交叉編譯——

什么是交叉編譯 交叉編譯 是在一個平臺上生成臨海一個平臺可執行代碼. eg.在windows上面編寫C51代碼&#xff0c;并編譯生成可執行代碼。如xx.hex 我們在Ubuntu上編寫樹莓派的代碼&#xff0c;并編譯成可執行代碼。a.out. 是在樹莓派上運行&#xff0c;不在Ubuntu Linux上面運…

便攜式iv測試儀特點

TH-PV30便攜式IV測試儀是一種用于測量半導體器件電學特性的設備&#xff0c;它具有體積小、重量輕、便于攜帶等特點&#xff0c;廣泛應用于半導體行業、科研實驗室以及教育領域。 該測試儀的工作原理基于四探針法&#xff0c;通過在半導體器件表面放置四個金屬探針&#xff0c…

【vs2022】安裝copilot和reshaper

直接安裝新版vs 17.10 自帶集成的copilot支持安裝resharper 可以跳過市場里的reshper安裝好后依然可以直接使用vs。 resharper 2024.1.2 市場里還是i老版本&#xff1a; copilot 不兼容,這個是之前市場安裝的版本 官方建議用vs intall 安裝 安裝 GitHub Copilot GitHub.Co…

詳解http協議

什么是HTTP協議 定義 Http協議即超文本傳送協議 (HTTP-Hypertext transfer protocol) 。 它定義了瀏覽器&#xff08;即萬維網客戶進程&#xff09;怎樣向萬維網服務器請求萬維網文檔&#xff0c;以及服務器怎樣把文檔傳送給瀏覽器。從層次的角度看&#xff0c;HTTP是面向&am…

第四十一天 | 62.不同路徑 63.不同路徑|| 343.整數拆分 96.不同的二叉搜索樹

題目&#xff1a;62.不同路徑 1.二維dp數組dp[i][j]含義&#xff1a;到達&#xff08;i&#xff0c;j&#xff09;位置有dp[i][j]種方法。 2.動態轉移方程&#xff1a;dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化&#xff1a;dp[0][j] 1, dp[i][0] 1 &#xff08;第一…

Vue3設置緩存:storage.ts

在vue文件使用&#xff1a; import { Local,Session } from //utils/storage; // Local if (!Local.get(字段名)) Local.set(字段名, 字段的值);// Session Session.getToken()storage.ts文件&#xff1a; import Cookies from js-cookie;/*** window.localStorage 瀏覽器永…

uniapp 安卓 Pc端真機瀏覽器調試

下載插件:真機模擬瀏覽器 1. 安裝, 每次啟用時使用usb 線連接電腦, 并且打開手機或者POS (調試設備)開發者模式, 比如我的是pos 機 則在系統設置中找到版本號,點擊多次就會觸發開發者模式 2.打開真機模擬軟件,打開后會打開一個瀏覽器,如果想要模擬google的瀏覽器則 在瀏覽器地…

精準鍵位提示,鍵盤盲打輕松入門

在說明精準鍵位提示之前&#xff0c;我們先來看一張圖&#xff1a; 這是一張標準的基準鍵位圖&#xff0c;也就是打字時我們雙手的8個手指放在基準鍵位上&#xff0c;在打不同的字母時&#xff0c;我們的手指以基準鍵位為中心&#xff0c;或上、或下、或左、或右&#xff0c;在…