python數據類型之元組、集合和字典

目錄

0.三者主要作用

1.元組

元組特點

創建元組

元組解包

可變和不可變元素元組

2.集合

集合特點

創建集合

集合元素要求

集合方法

訪問與修改

子集和超集

相等性判斷

集合運算

不可變集合

3.字典

字典特點

字典創建和常見操作

字典內置方法

pprin模塊


0.三者主要作用

可以使用元組存儲一個固定的元素列表
可以使用集合存儲和快速訪問不重復的元素
可以使用字典存儲鍵值對并使用這些關鍵字來快速訪問元素

1.元組

元組特點

元組跟列表相似,但是元組中的元素是固定的(固定元素+固定順序)。
也就是說,一旦一個元組 A 被創建,就無法對元組 A 中的元素進行添加、刪除、替換或重新排序。(但是可以訪問)
但是可以將元組 A 進行像列表相似的操作然后創建新元組 B,比如 B = 2 * A,B = A[2: 4],C = A + B 等。
再比如 A = (1, 2, 3),B = (1, 2, 3,4)時,B = A 進行賦值操作也是可行的。
注意,B[: -1] = B[0: -1] = B[0: -1 + len(B)]

創建元組

# 創建一個空元組
t1 = ()
t2 = tuple()# 創建一個具有 3 個元素的元組
t3 = (1, 2, 3)# 使用 tuple 函數通過列表創建一個元組
t4 = tuple([x for x in range(5)])# 使用 tuple 函數通過字符串創建一個元組
t5 = tuple("abcdabcd")
# t5 = ('a', 'b', 'c', 'd', 'a', 'b', 'c', 'd')# 使用 list 函數將元組轉換為列表
t6 = list(t5)
# t6 = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd']

創建只有一個元素的元組

# 創建一個只有一個元素的元組
t1 = (4,)  # 注意有個逗號
t1 = 4,  # 元組
t2 = (1) # t2 不是元組,而是一次賦值,將 1 賦給 t2
print(type(t2), t2)  # <class 'int'> 1

元組解包

在Python中,元組解包是一種將元組中的多個值賦給多個變量的方式。這可以在賦值操作中直接完成,也可以在函數調用中使用來提供參數。

解包可以使用星號表達式來選擇性地解包元組中的部分元素。

# -*- coding: utf-8 -*-# 直接解包
tup = (1, 2, 3)
a, b, c = tup
print(a, b, c)
# a = 1, b = 2, c = 3# 使用星號表達式解包
tup = (1, 2, 3, 4, 5)
x, y, *rest = tup
print(x, y, rest)
# x = 1, y = 2, rest = [3, 4, 5]# 函數調用中的解包
def func(v1, v2, v3):print(v1, v2, v3)args = (1, 2, 3)
# func(args)  
# TypeError: func() missing 2 required positional arguments: 'v2' and 'v3'
func(*args)  # 輸出: 1 2 3# 函數返回多個值時的解包
def get_values():return 1, 2, 3a, b, c = get_values()  # a = 1, b = 2, c = 3

可變和不可變元素元組

一個元組包含了一個固定的元素列表。一個元組里的一個個體元素可能是易變的。如果一個元組的元素都是不可變的,那么這個元組被稱為元素不可變元組。否則是元素可變元組。

# -*- coding: utf-8 -*-# 元素不可變元組
data = (1, 2, 3)  # 這里1, 2, 3都是不可變的
data2 = ("abc", "hello", "world")  # 這里字符串"abc", "hello", "world"都是不可變的
# data2[0][0] = 'x'  
# 將會報錯:TypeError: 'str' object does not support item assignment# 元素可變元組
data3 = ([1, 2, 3], ["x", "y"])  # [1, 2, 3]是列表,是可變的
data3[0][0] = 100   # 不會報錯
print(data3)   # ([100, 2, 3], ['x', 'y'])
# 這里是將元組的第一個元素,是個列表,這個列表的第一個元素的地址進行改變
# 而沒有該彼岸元組第一個元素的地址,即還是這個列表# 元組本身不可變和可變是指在元組內容初始化后,不能更改元組元素的內存地址
value = [99, 99]
# data3[0] = value   
# 將會報錯:TypeError: 'tuple' object does not support item assignment
# 這里試圖將data3這個元組的第一個元素的地址換成[99, 99]的地址,是非法的
# 因為元組是不可變的

2.集合

集合特點

集合與列表相似,但是集合中的元素時不重復且不是按任何特定順序放置的。
集合內的元素不能是列表或集合。

創建集合

# -*- coding: utf-8 -*-# 創建一個空集
set1 = set()  # 注意 set2 = {} 是創建了一個字典# 創建 1 個元素的集合
set2 = {5}# 創建 3 個元素的集合
set3 = {1, 3, 5}# 用 set 函數通過元組創建集合
set4 = set((1, 3, 5))# 用 set 函數通過列表創建集合
set5 = set([x ** 2 for x in range(5)])# 用 set 函數通過字符串創建集合
set6 = set("helloworld")
print(set6)  # 注意集合是無序的,每次打印可能會不一樣# 用 list 函數通過集合創建一個列表
list1 = list(set5)# 用 tuple 函數通過集合創建一個元組
t1 = tuple(set5)

集合元素要求

集合中的每個元素必須是可哈希的,hashable。
python 中的每一個對象都有一個哈希值,而且如果在對象的生命周期里該對象的哈希值從未改變,那么這個對象是哈希的,也就是不可變的。
列表、集合和字典是不可哈希的;數字、字符串和元組是哈希的。
# -*- coding: utf-8 -*-set1 = {1, 3, 5}  # ok
set2 = {[1, 2], [3]}  # error:TypeError: unhashable type: 'list'

集合方法

訪問與修改

# -*- coding: utf-8 -*-set1 = {1, 2, 3, "a", "b"}
# 對集合添加一個元素
set1.add(4)
print(set1)# update 方法 # 單個元素用 add,可迭代的對象用 update
set1 = {1, 2, 3}
set1.update("abc")
print(set1)  # {1, 2, 3, 'b', 'c', 'a'}
set1.update({2, 3, 4})
print(set1)  # {1, 2, 3, 'b', 'c', 4, 'a'}
set1.update([4, 5, 6])
print(set1)  # {1, 2, 3, 'b', 'c', 4, 5, 6, 'a'}# 刪除元素
set1.remove(3)  # 刪除元素,不存在則拋出一個 KeyError 異常
print(set1.pop())
set1.discard(3)  # 刪除元素,不存在不報錯# len 函數、max 函數、min 函數、sum 函數
print(len(set1))# 可以使用 for 循環遍歷一個集合中的所有元素
for x in set1:print(x)# in 和 not in
print(100 in set1)

子集和超集

使用 issubset()方法和 issuperset()方法
set1 = {1, 2, 3}
set2 = {1, 3, 2, 4}
print(set1.issubset(set2))  # True
print(set2.issuperset(set1))  # True

比較運算符

相等性判斷

set1 = {1, 2, 3}
set2 = {1, 3, 2, 4}
set3 = {3, 1, 2,2}
print(set1 == set2)  # False
print(set1 != set2)  # True
print(set1 == set3)  # True

集合運算

并集、交集、差集、對稱差
集合運算是帶有返回值,用來創建新集合,而不會改變原有集合
并集,用 union 方法或者 | 運算符
set1 = {1, 2, 4}
set2 = {1, 3, 5}
print(set1.union(set2)) # {1, 2, 3, 4, 5}
print(set1 | set2) # {1, 2, 3, 4, 5}
交集,用 intersection 方法或者 &運算符
print(set1.intersection(set2)) 
print(set1 & set2) # {1}
差集,用 difference 方法或者 -運算符(A–B 表示出現在集合 A 但不出現在集合 B 的元素的集合)
print(set1.difference(set2))
print(set1 - set2) # {2, 4}
對稱差,用 symmetric_difference 方法或者 ^運算符
print(set1.symmetric_difference(set2))
print(set1 ^ set2) # {2, 3, 4, 5}

不可變集合

# -*- coding: utf-8 -*-# 可變集合
set1 = {1, 2, 3, "a", "b"}
set1.add(4)  # ok
print(set1)  # {1, 2, 3, 4, 'b', 'a'}# 不可變集合
data = [1, 2, 3]
set2 = frozenset(data)  # 轉變為不可變集合
# set2.add(4)   # AttributeError: 'frozenset' object has no attribute 'add'

3.字典

字典特點

一個字典是按照關鍵字存儲值的集合,簡稱存儲“鍵值”的集合。
它通過使用關鍵字實現快速獲取,刪除和更新值。這些關鍵字很像下標運算符。
在一個列表中,下標是整數; 在一個字典中,關鍵字必須是一個可哈希對象。
一個字典不能包含有重復的關鍵字 ,每個關鍵字都對應著一個值。
一個關鍵字和它對應的值形成存儲在字典的一個鍵值對。這種數據結構被稱為“字典”。

字典創建和常見操作

條目 = 關鍵字(key) : 值(value)
關鍵字必須是可哈希的,比如字符串和數字,元組。
值可以是任意類型,比如是不可哈希的列表、字典、集合。
# 創建空字典
d0 = {}# 創建具有 3 個條目的字典
d1 = {11: "bob", 12: "other", "ras2": 234}
print(type(d1))  # <class 'dict'>
print(d1)  # {11: 'bob', 12: 'other', 'ras2': 234}
創建字典時指明key和value的類型

在Python中創建字典時,通常不需要顯式指定鍵(key)和值(value)的類型,因為字典是一種動態類型的數據結構,它可以容納任意類型的鍵和值。然而,如果你想在字典中指定鍵和值的類型,可以使用類型提示(Type Hints)來提供額外的信息,這在代碼的可讀性和維護性方面是有益的。

# -*- coding: utf-8 -*-from typing import Dict, Any, Union# 使用類型提示聲明字典的鍵和值的類型
my_dict: Dict[str, Union[int, str]] = {"key1": 42,"key2": "value2","key3": 3.14  # 這個值將被視為 Union[int, str] 中的任一類型
}# 打印字典
print(my_dict)

請注意,類型提示僅僅是一種靜態分析工具,對于 Python 解釋器本身并沒有強制約束。它主要用于提高代碼的可讀性和與其他開發者的交流。

添加、替換和獲取值
# -*- coding: utf-8 -*-# 添加一個條目到字典中,dictionaryName[key] = value
d1 = {"22-23-1827": "bob"}d1["22-23-1828"] = "tom"
print(d1)  # {'22-23-1827': 'bob', '22-23-1828': 'tom'}# 如果這個關鍵字在字典中已經存在,添加條目的語法將替換該關鍵字對應的值
d1["22-23-1828"] = "xxxxx"
print(d1)  # {'22-23-1827': 'bob', '22-23-1828': 'xxxxx'}# 從字典中獲取一個值,varName = dictionaryName[key]
x = d1["22-23-1827"]
print(x)# 如果字典中沒有這個關鍵字,將拋出一個 KeyError 異常
# print(d1["123456"])  # KeyError: '123456'
刪除數據
使用語法:del DictName[key]
d2 = {'22-23-1827': 'tom', '22-23-1828': 'bob'}
del d2['22-23-1828']
print(d2)  # {'22-23-1827': 'tom'}# 如果字典中沒有這個關鍵字,將拋出一個 KeyError 異常
遍歷全部的鍵值對
使用 for 循環來遍歷字典的所有 關鍵字
d2 = {'22-23-1827': 'tom', '22-23-1828': 'bob'}
for key in d2:print(key + " : " + d2[key])
"""
22-23-1827 : tom
22-23-1828 : bob
"""
len 函數獲取鍵值對的個數
d2 = {'22-23-1827': 'tom', '22-23-1828': 'bob'}
print(len(d2))  # 2
in 和 not in 判斷關鍵字是否在字典中
d2 = {'22-23-1827': 'tom', '22-23-1828': 'bob'}
print('22-23-1827' in d2)  # True
print('123456' in d2)  # False
print('tom' in d2)  # False
相等性判斷
d1 = {'22-23-1827': 'tom', '22-23-1828': 'bob'}
d2 = {'22-23-1828': 'bob', '22-23-1827': 'tom'}
print(d1 == d2)  # True
print(d2 != d1)  # False
注意字典和字典之間不能用 <, <=, >, >= 這幾個比較運算符,否則會拋出 TypeError 異常

字典內置方法

get(key)方法,當 key 不在字典時,會返回一個空值 None,類似于 dictionaryName[key]
get(key, elseValue) ,當 key 不在字典時,返回值 elseValue
data = {'tom': 18, 'bob': 19}
print(data.get('tom'))  # 18
print(data.get('zhang'))  # None
print(data.get('zhang', 99))  # 99
setdefault(key, elseValue) 方法,如果 key 在字典,則返回該關鍵字對應的值
如果 key 不在字典,則添加鍵值對 key: elseValue,并返回值 elseValue
data = {'tom': 18, 'bob': 19}print(data.setdefault('tom', 100))  # 18
print(data)  # {'tom': 18, 'bob': 19}print(data.setdefault('zhang', 100))  # 100
print(data)  # {'tom': 18, 'bob': 19, 'zhang': 100}print(data.setdefault('zhang', 999))  # 100
print(data)  # {'tom': 18, 'bob': 19, 'zhang': 100}
pop(key)方法,比 del dictionaryName[key]多了一個作用,如果 key 不存在則 KeyError 異常
pop(key, elseValue)
data = {'tom': 18, 'bob': 19}ret = data.pop("tom")
print(data)  # {'bob': 19}
print(ret)   # 18# data.pop("xxx")  # KeyError: 'xxx'ret = data.pop("xxx", 100)  # 不會KeyError
print(data)  # {'bob': 19}
print(ret)   # 100

update 方法用來字典合并

# 相同 key 的部分新的字典會覆蓋舊的字典
old_dict = {"部門": "財務", "姓名": "王濤", "電話": 12345678900}
new_dict = {"性別": "男", "部門": "技術", "電話": 12734735335}
old_dict.update(new_dict)
print(old_dict)  # {'部門': '技術', '姓名': '王濤', '電話': 12734735335, '性別': '男'}

keys()、values()和items()方法

data = {'tom': 18, 'bob': 19}x1 = data.keys()
y1 = tuple(x1)
print(x1)  # dict_keys(['tom', 'bob'])
print(y1)  # ('tom', 'bob')
print()x2 = data.values()
y2 = list(x2)
print(x2)  # dict_values([18, 19])
print(y2)  # [18, 19]
print()x3 = data.items()
y3 = tuple(x3)
print(x3)  # dict_items([('tom', 18), ('bob', 19)])
print(y3)  # (('tom', 18), ('bob', 19))
print()

pprin模塊

漂亮打印:pprint 模塊的 pprint 函數和 pformat 函數
# -*- coding: utf-8 -*-import pprintmessage = "我愛程序設計,我要好好學習,天天向上。"
count_dict = {}
for character in message:count_dict[character] = count_dict.get(character, 0) + 1#print(count_dict)
#print()pprint.pprint(count_dict)
print()new = pprint.pformat(count_dict)
print(new)
print()

運行結果

{'。': 1,'上': 1,'習': 1,'向': 1,'天': 2,'好': 2,'學': 1,'序': 1,'我': 2,'愛': 1,'程': 1,'要': 1,'計': 1,'設': 1,',': 2}{'。': 1,'上': 1,'習': 1,'向': 1,'天': 2,'好': 2,'學': 1,'序': 1,'我': 2,'愛': 1,'程': 1,'要': 1,'計': 1,'設': 1,',': 2}

end

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

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

相關文章

k8s——Pod詳解

一、Pod基礎概念 1.1 Pod定義 Pod是kubernetes中最小的資源管理組件&#xff0c;Pod也是最小化運行容器化應用的資源對象。一個Pod代表著集群中運行的一個進程。kubernetes中其他大多數組件都是圍繞著Pod來進行支撐和擴展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod運行…

繆爾賽思又來到了你的面前(哈希)

定義一棵根節點為 1 1 1&#xff0c; n ( 2 ≤ n ≤ 1 0 3 ) n(2≤n≤10^3) n(2≤n≤103) 個節點的樹的哈希值為&#xff1a; H ∑ i 1 n X i Y f a ( i ) m o d 998244353 H∑^n_{i1}X^iY^{fa(i)}\ mod\ 998244353 Hi1∑n?XiYfa(i) mod 998244353 f a ( i ) fa(i) fa(i)…

斷網之后的頁面,Autox.js是點擊還是上下滑動比較好?

在處理斷網之后的頁面&#xff0c;選擇點擊還是上下滑動作為刷新操作&#xff0c;取決于應用的設計和用戶界面。通常&#xff0c;這兩種操作都可以作為刷新頁面的方式&#xff0c;但它們各自有不同的適用場景&#xff1a; 點擊刷新 - 適用場景&#xff1a;如果應用提供了一個明…

Java進階學習筆記7——權限修飾符

什么是權限修飾符&#xff1f; 就是用來限制類中的成員&#xff08;成員變量、成員方法、構造器、代碼塊....&#xff09;能夠被訪問的范圍。 protected使用的比較少&#xff0c;但是程序員還是要閱讀代碼&#xff0c;看官方文檔是怎么寫的&#xff0c;都會接觸到protected修飾…

C#串口通信-串口相關參數介紹

串口通訊(Serial Communication)&#xff0c;是指外設和計算機間&#xff0c;通過數據信號線、地線等&#xff0c;按位進行傳輸數據的一種雙向通訊方式。 串口是一種接口標準&#xff0c;它規定了接口的電氣標準&#xff0c;沒有規定接口插件電纜以及使用的通信協議&#xff0c…

ssh 配置 authorized_keys 后無法免密登錄

查看日志&#xff1a; tail -f /var/log/auth.log May 25 15:55:13 121 sudo: pam_unix(sudo:session): session opened for user root by root(uid0) May 25 15:55:13 121 sshd[550561]: Received signal 15; terminating. May 25 15:55:13 121 sshd[922866]: Server liste…

性能測試場景的設計方法

引用&#xff1a;根據2008年Aberdeen Group的研究報告&#xff0c;對于Web網站&#xff0c;1秒的頁面加載延遲相當于少了11%的PV&#xff08;page view&#xff09;&#xff0c;相當于降低了16%的顧客滿意度。如果從金錢的角度計算&#xff0c;就意味著&#xff1a;如果一個網站…

「探討」:什么是網絡審計?好用的網絡審計系統推薦【圖文詳解】

網絡是企業運營、政府管理、個人生活不可或缺的基礎設施。 然而網絡安全問題卻日益凸顯&#xff0c;數據泄露、網絡攻擊、欺詐行為等風險日益嚴重。 一、網絡審計的定義 網絡審計&#xff0c;又稱信息技術審計或電子審計&#xff0c;是指審計人員運用專業技能和工具&#xff…

fdk-aac將aac格式轉為pcm數據

int sampleRate 44100; // 采樣率int sampleSizeInBits 16; // 采樣位數&#xff0c;通常是16int channels 2; // 通道數&#xff0c;單聲道為1&#xff0c;立體聲為2FILE *m_fd NULL;FILE *m_fd2 NULL;HANDLE_AACDECODER decoder aacDecoder_Open(TT_MP4_ADTS, 1);if (!…

實戰之快速完成 ChatGLM3-6B 在 GPU-8G的 INT4 量化和本地部署

ChatGLM3 (ChatGLM3-6B) 項目地址 https://github.com/THUDM/ChatGLM3大模型是很吃CPU和顯卡的&#xff0c;所以&#xff0c;要不有一個好的CPU&#xff0c;要不有一塊好的顯卡&#xff0c;顯卡盡量13G&#xff0c;內存基本要32GB。 清華大模型分為三種(ChatGLM3-6B-Base&…

“大數據建模、分析、挖掘技術應用研修班”的通知!

隨著2015年9月國務院發布了《關于印發促進大數據發展行動綱要的通知》&#xff0c;各類型數據呈現出了指數級增長&#xff0c;數據成了每個組織的命脈。今天所產生的數據比過去幾年所產生的數據大好幾個數量級&#xff0c;企業有了能夠輕松訪問和分析數據以提高性能的新機會&am…

Vue3中為Ant Design Vue中table的checkbox加tooltip、popover

問題的產生 Vue版本&#xff1a;3.3.13 ant-design-vue 版本&#xff1a;3.x.x 在工作時遇到一個場景&#xff0c;需要在 ant-table 的 checkbox 被禁用的時候提示原因&#xff0c;但是在 ant-design-vue 文檔中并沒有發現有相關介紹。 首先我去看了issue中是否有提到相關問題…

【金磚賽】基于docker搭鏈

一&#xff0e;基于docker搭建 啟動并檢查是否啟動成功 #啟動命令 sudo systemctl start docker#檢查命令 sudo systemctl status docker修改權限 chomd 777 build_chain.sh 進行4節點聯盟鏈搭建&#xff08;舉例&#xff09; sudo ./build_chain.sh -d -l "127.0.0.1…

OOM不會導致JVM退出

問題來源 一次生產事故&#xff0c;由于一次性從數據庫查詢過多數據導致線程 OOM&#xff1a;Java heap space 異常&#xff08;千萬級表&#xff0c;JVM堆內存2G&#xff09;&#xff0c;但是在線程OOM發生時&#xff0c;java進程卻沒有立即掛掉。 ##OOM與異常 說到底OutOfM…

基于Android Studio記事本系統

目錄 項目介紹 圖片展示 運行環境 獲取方式 項目介紹 具有登錄&#xff0c;注冊&#xff0c;記住密碼&#xff0c;自動登錄的功能&#xff1b; 可以新增記事本&#xff0c;編輯&#xff0c;刪除記事本信息&#xff0c;同時可以設置主標題&#xff0c;內容&#xff0c;以及…

Ansible自動化運維中的Setup收集模塊應用詳解

作者主頁&#xff1a;點擊&#xff01; Ansible專欄&#xff1a;點擊&#xff01; 創作時間&#xff1a;2024年5月22日13點14分 &#x1f4af;趣站推薦&#x1f4af; 前些天發現了一個巨牛的&#x1f916;人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xf…

服務器沒有圖形界面沒有顯示器怎么辦

可以用vnc。 vnc是開元的。什么是vnc&#xff1f; 使用vnc 下載vnc和vncserver命令。 每生成一個圖形界面就叫做開啟session會話。 vnc相關命令&#xff1a; start a new session: vncserver。 如果沒有會話&#xff0c;一般從:1開始 端口5901 vncserver :2 #指定會話為:2 端…

WinForm+SQL Server+.NET開發菜鳥驛站管理系統

完整效果看嗶哩嗶哩&#xff0c;有需要其他系統&#xff0c;可以私信

Leecode熱題100---55:跳躍游戲(貪心算法)

題目&#xff1a; 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 貪心算…

Spring中的三級緩存和循環依賴

三級緩存 在 Spring 中&#xff0c;Bean 的創建過程涉及到三級緩存。這三級緩存分別是 singletonObjects、earlySingletonObjects 和 singletonFactories。它們在 Spring 容器啟動時用于存儲正在創建的 Bean 實例。 在 Spring 源碼中&#xff0c;三級緩存涉及到了 DefaultSin…