python數據類型之字典、元組

一、字典

1、定義字典

字典是 有序(3.6+以前無序)鍵不重復?且 元素只能是鍵值對可變的?個?容器。鍵不重復,重復則會被覆蓋

如下定義一個字典

# 使用大括號 {} 來創建空字典
test_dic1 = {}
# 使用內建函數 dict() 創建字典:
test_dic2 = dict()
# 創建有值得字典
info = {"age": 12,"status": True,"name": "測試","hobby": ['籃球', '足球'],(11, 22, 33): ["alex", "eric"],True: 5,12: 10
}# 打印字典
print(info)  # {'age': 12, 'status': True, 'name': '測試', 'hobby': ['籃球', '足球'], (11, 22, 33): ['alex', 'eric'], True: 5, 12: 10}
# 查看字典大小
print(len(info))  # 7
# 字典類型
print(type(info))  # <class 'dict'>

字典中對鍵值得要求:

  • 鍵:必須可哈希。 目前為止學到的可哈希的類型:int/bool/str/tuple;不可哈希的類型:list/set/dict。(集合)
  • 值:任意類型。

如下的字典是不合法的

# 不合法
v1 = {[1, 2, 3]: '周杰倫',"age" : 18
} 
v2 = {{1,2,3}: "哈哈哈",'name':"alex"
} v3 = {{"k1":123,"k2":456}: '呵呵呵',"age":999
}

?注意:字典里 如何一個key是1或0,另一個是True或False,會替換掉,如下?


test = {1: 5, True: 6}
print(test)  # 打印結果是{1: 6}

一般在什么情況下會用到字典呢?

當我們想要表示一組固定信息時,用字典可以更加的直觀,例如:

# 用戶列表
user_list = [ ("alex","123"), ("admin","666") ]
# 用戶列表 字典表示
user_list = [ {"name":"alex","pwd":"123"}, {"name":"eric","pwd":"123"} ]

2、獲取字典值

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 獲取值
name = info.get("name")
email = info.get("email")  # 如果鍵不存在返回 None
data = info.get("data")  # 注意:如果值是None 返回結果就是值Noneif name:print("鍵name存在,值是", name)  # 打印
if email:print("鍵email存在,值是", email)  # 不打印
if data:print("鍵data存在,值是", data)  # 不打印

3、所有鍵

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 所有鍵
keys = info.keys()
print(keys)'''
python3輸出 dict_keys(['age', 'status', 'name', 'data'])
但是python2輸出['age', 'status', 'name', 'data']
Python3中返回的是高仿列表,這個高仿的列表可以被循環顯示
'''
# 循環
for ele in info.keys():print(ele)
# 當然也可以通過list將高仿的列表轉成列表
result = list(keys)
print(result)  # ['age', 'status', 'name', 'data']# 獲取所有鍵 也可以直接用for循環
for item in info:print(item)

4、是否存在鍵

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 是否存在鍵
# 方式1(推薦)
if "name" in info:print("info存在鍵name")
# 方式2
if "name" in info.keys():print("info存在鍵name")

5、所有值

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 所有值
values = info.values()
print(values)
'''
python3輸出 dict_values([12, 0, '測試', None])
python2輸出 [12, 0, '測試', None]
python3輸出高仿列表這個高仿的列表可以被循環顯示
'''
# 循環
for v in values:print(v)# 當然通過list可以將高仿列表轉成列表
value1 = list(values)
print(value1)

6、是否存在值

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 是否存在值
if "測試" in info.values():print("info 存在值 測試")

7、所有鍵值對

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 所有的鍵值
item1 = info.items()
print(item1)  # dict_items([('age', 12), ('status', 0), ('name', '測試'), ('data', None)])for item in info.items():print(item[0], item[1])  # item是一個元組 (鍵,值)for key, value in info.items():print(key, value)  # key代表鍵,value代表值,將鍵和值從元組中直接拆分出來了。

8、是否存在鍵值對

info = {"age": 12,"status": 0,"name": "測試","data": None
}
# 是否存在鍵值
if ('age', 12) in info.items():print("在")
else:print("不在")

9、設置值

info = {"age": 12,"status": 0,"name": "測試","data": None
}
# 設置值
info.setdefault("email", "test@163.com")
print(info)  # {'age': 12, 'status': 0, 'name': '測試', 'data': None, 'email': 'test@163.com'}info.setdefault("name", "test")  # 如果鍵存在 則不設置
print(info)  # {'age': 12, 'status': 0, 'name': '測試', 'data': None, 'email': 'test@163.com'}

10、更新鍵值對

info = {"age": 12,"status": 0,"name": "測試","data": None
}
# 更新值
info.update({"age": 14, "name": "test"})  # info中沒有的鍵直接添加;有的鍵則更新值
print(info)  # {'age': 14, 'status': 0, 'name': 'test', 'data': None}

11、移除指定鍵值對

info = {"age": 12,"status": 0,"name": "測試","data": None
}
# 移除指定鍵值對
info.pop("age")
print(info)  # {'status': 0, 'name': '測試', 'data': None}

12、按照順序移除(后進先出)

info = {"age": 12,"status": 0,"name": "測試","data": None
}
# 按順序移除
data = info.popitem()
print(info)  # {'age': 12, 'status': 0, 'name': '測試'}
print(data)  # ('data', None) 被移除的被自動轉成了一個元祖
  • py3.6后,popitem移除最后的值。
  • py3.6之前,popitem隨機刪除。

13、求并集

(Python3.9新加入)

v1 = {"k1": 1, "k2": 2}
v2 = {"k2": 22, "k3": 33}v3 = v1 | v2
print(v3) # {'k1': 1, 'k2': 22, 'k3': 33}

14、索引(鍵)

字典不同于元組和列表,字典的索引是,而列表和元組則是?0、1、2等數值?。?

info = {"age": 12,"status": 0,"name": "測試","data": None
}print(info["age"])  # 輸出:12
print(info["xxxx"])  # 報錯,通過鍵為索引去獲取之后時,鍵不存在會報錯(以后項目開發時建議使用get方法根據鍵去獲取值)value = info.get("xxxxx")  # None
print(value)

15、根據索引鍵 修改值 和 添加值 和 刪除鍵值對

上述示例通過鍵可以找到字典中的值,通過鍵也可以對字典進行添加和更新操作?

info = {"age": 12,"status": 0,"name": "測試","data": None
}# 增加鍵值對
info["gender"] = "男"
print(info)  # {'age': 12, 'status': 0, 'name': '測試', 'data': None, 'gender': '男'}# 更新鍵值對
info["age"] = 18
print(info)  # {'age': 18, 'status': 0, 'name': '測試', 'data': None, 'gender': '男'}# 刪除鍵值對
del info["age"]  # 刪除info字典中鍵為age的那個鍵值對(鍵不存在則報錯)
print(info)  # 輸出: {'status': 0, 'name': '測試', 'data': None, 'gender': '男'}

16、轉換

v = dict([("k1", "v1"), ["k2", "v2"]])print(v)  # { "k1":"v1", "k2":"v2" }
info = {"age": 12, "status": True, "name": "test"}
v1 = list(info)  # ["age","status","name"]
v2 = list(info.keys())  # ["age","status","name"]
v3 = list(info.values())  # [12,True,"test"]
v4 = list(info.items())  # [ ("age",12), ("status",True), ("name","test") ]

17、嵌套

# 字典的鍵必須可哈希(list/set/dict不可哈希)
info = {(11, 22): 123
}# 錯誤
info = {(11, [11, 22, ], 22): "alex"
}# 字典的值可以是任意類型
info = {"k1": {12, 3, 5},"k2": {"xx": "x1"}
}# 字典的鍵和集合的元素在遇到 布爾值 和 1、0 時,需注意重復的情況。如下實際為1:3
info = {1: 0,True: 3
}
# 元組的元素不可以被替換
dic = {'name': 'test','age': 48,'wife': [{'name': 'aaa', 'age': 38}, {'name': 'bbb', 'age': 48}],'children': ['第一個娃', '第二個娃']
}
"""
1. 獲取test的妻子名字d1 = dic['wife'][0]['name']print(d1)
2. 獲取test的孩子們d2 = dic['children']print(d2)
3. 獲取test的第一個孩子d3 = dic['children'][0]print(d3)
4. test的媳婦姓名變更為 cccdic['wife'][0]['name'] = "ccc"print(dic)
5. test再娶一任妻子dic['wife'].append( {"name":"鐵錘","age":19} )print(dic)6. 給test添加一個愛好:吹牛逼dic['hobby'] = "吹牛逼"print(dic)
7. 刪除test的年齡del dic['age']或dic.pop('age')print(dic)
"""

二、元組

1、定義

列表(list),是一個有序可變的容器,在里面可以存放多個不同類型的元素。

元組(tuple),是一個有序不可變的容器,在里面可以存放多個不同類型的元素。

Python 的元組與列表類似,不同之處在于元組的元素不能修改。

元組使用小括號?( ),列表使用方括號?[ ]。

元組創建很簡單,只需要在括號中添加元素,并使用逗號隔開即可。

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d" ? # ?不需要括號也可以

創建空元組

tup1 = ()

建議在元組的最后多加一個逗號,用于標識他是一個元組。特別是元組中只包含一個元素時,需要在元素后面添加逗號?,?,否則括號會被當作運算符使用:

>>> tup1 = (50)
>>> type(tup1) ? ? # 不加逗號,類型為整型
<class 'int'>>>> tup1 = (50,)
>>> type(tup1) ? ? # 加上逗號,類型為元組
<class 'tuple'>

元組與字符串類似,下標索引從 0 開始,可以進行截取,組合等。?

user_list = ("范德彪","劉華強",'尼古拉斯趙四',)
print( user_list[0] )
print( user_list[2] )
print( user_list[3] )#切片
print( user_list[0:2] )
print( user_list[1:] )
print( user_list[:-1] )#步長演示
user_list = ("范德彪","劉華強",'尼古拉斯趙四',"宋小寶","劉能")
print( user_list[1:4:2] )
print( user_list[0::2] )
print( user_list[1::2] )
print( user_list[4:1:-1] )

2、訪問元組

元組可以使用下標索引來訪問元組中的值,如下實例:

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])結果
tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

3、獲取長度

user_list = ("范德彪","劉華強",'尼古拉斯趙四',)
print( len(user_list) )

4、 for循環

# in 運算符
user_list = ("范德彪","劉華強",'尼古拉斯趙四',"宋小寶","劉能")
for item in user_list:print(item)# 下標user_list = ("范德彪","劉華強",'尼古拉斯趙四',"宋小寶","劉能")
for item in user_list:if item == '劉華強':continueprint(name)#目前:只有 str、list、tuple 可以被for循環。 "xxx"  [11,22,33]  (111,22,33) 
# len + range + for + 索引
user_list = ("范德彪","劉華強",'尼古拉斯趙四',"宋小寶","劉能")
for index in range(len(user_list)):item = user_list[index]print(item)

5、修改元組

元組中的元素值是不允許修改的,但我們可以對元組進行連接組合,如下實例:

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')# 以下修改元組元素操作是非法的。
# tup1[0] = 100# 創建一個新的元組
tup3 = tup1 + tup2
print (tup3) # (12, 34.56, 'abc', 'xyz')

6、刪除元組

元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組,如下實例:

#!/usr/bin/python3tup = ('Google', 'Runoob', 1997, 2000)print (tup)
del tup
print ("刪除后的元組 tup : ")
print (tup)以上實例元組被刪除后,輸出變量會有異常信息,輸出如下所示:
刪除后的元組 tup : 
Traceback (most recent call last):File "test.py", line 8, in <module>print (tup)
NameError: name 'tup' is not defined

7、元組運算符

與字符串一樣,元組之間可以使用?+、+=和?*?號進行運算。這就意味著他們可以組合和復制,運算后會生成一個新的元組。

相加:兩個列表相加獲取生成一個新的列表。

data = ("趙四","劉能") + ("宋曉峰","范德彪")
print(data) # ("趙四","劉能","宋曉峰","范德彪")v1 = ("趙四","劉能")
v2 = ("宋曉峰","范德彪")
v3 = v1 + v2
print(v3) # ("趙四","劉能","宋曉峰","范德彪")

相乘,列表*整型 將列表中的元素再創建N份并生成一個新的列表。

data = ("趙四","劉能") * 2
print(data) # ("趙四","劉能","趙四","劉能")v1 = ("趙四","劉能")
v2 = v1 * 2
print(v1) # ("趙四","劉能")
print(v2) # ("趙四","劉能","趙四","劉能")

8、元組索引,截取

因為元組也是一個序列,所以我們可以訪問元組中的指定位置的元素,也可以截取索引中的一段元素,如下所示:元組:>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
>>>

?9、轉換

其他類型轉換為元組,使用tuple(其他類型),目前只有字符串和列表可以轉換為元組。

name = "測試"
data = tuple(name)
print(data) # 輸出 ("測","試")name = ["測試",18,"pythonav"]
data = tuple(name)
print(data) # 輸出 ("測試",18,"pythonav")

10、嵌套

由于元組和列表都可以充當容器,他們內部可以放很多元素,并且也支持元素內的各種嵌套。?

tu = ( 'a', 'b', ('c','d') )
tu1 = tu[0]
tu2 = tu[1]
tu3 = tu[2][0]
tu4 = tu[2][1]
tu5 = tu[2][1][3]print(tu1) # a
print(tu2) # b
print(tu3) # c
print(tu4) # d

11、關于元組是不可變的

所謂元組的不可變指的是元組所指向的內存中的內容不可變。

>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g' ? ? # 不支持修改元素
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup) ? ? # 查看內存地址
4440687904
>>> tup = (1,2,3)
>>> id(tup)
4441088800 ? ?# 內存地址不一樣了

從以上實例可以看出,重新賦值的元組 tup,綁定到新的對象了,不是修改了原來的對象。

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

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

相關文章

【華為OD題庫-032】數字游戲-java

題目 小明玩一個游戲。系統發1n張牌&#xff0c;每張牌上有一個整數。第一張給小明&#xff0c;后n張按照發牌順序排成連續的一行。需要小明判斷&#xff0c;后n張牌中&#xff0c;是否存在連續的若干張牌&#xff0c;其和可以整除小明手中牌上的數字. 輸入描述: 輸入數據有多組…

嵌入式基礎知識學習:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存儲器又稱閃存&#xff0c;它結合了ROM和RAM的長處&#xff0c;不僅具備電子可擦出可編程(EEPROM) 的性能&#xff0c;還不會斷電丟失數據同時可以快速讀取數據 (NVRAM 的優勢)&#xff0c;U 盤和MP3 里用的…

[論文筆記]MatchPyramid

引言 又一篇文本匹配論文Text Matching as Image Recognition,論文題目是 文本匹配當成圖像識別。 挺有意思的一篇工作,我們來看它是如何實現的。 作者受到卷積神經網絡在圖像識別中成功應用的啟發,其中神經元可以捕獲很多復雜的模式,作者提出將文本匹配看作是圖像識別任…

DDD落地:從網易新聞APP重構,看DDD的巨大價值

尼恩說在前面 在40歲老架構師 尼恩的讀者交流群(50)中&#xff0c;最近有小伙伴拿到了一線互聯網企業如阿里、滴滴、極兔、有贊、希音、百度、網易、美團的面試資格&#xff0c;遇到很多很重要的面試題&#xff1a; 談談你的DDD落地經驗&#xff1f; 談談你對DDD的理解&#x…

GEE:梯度提升樹(Gradient Boosting Tree)分類教程(樣本制作、特征添加、訓練、精度、參數優化、貢獻度、統計面積)

作者:CSDN @ _養樂多_ 本文將介紹在Google Earth Engine (GEE)平臺上進行梯度提升樹(Gradient Boosting Tree)分類的方法和代碼,其中包括制作樣本點教程(本地、在線和本地在線混合制作樣本點,合并樣本點等),加入特征變量(各種指數、紋理特征、時間序列特征、物候特征…

OpenStack云計算平臺-啟動一個實例

目錄 一、創建虛擬網絡 ?二、創建m1.nano規格的主機 三、生成一個鍵值對 四、增加安全組規則 ?五、啟動一個實例 1、確定實例選項 2、創建實例 3、使用虛擬控制臺訪問實例 4、驗證能否遠程訪問實例 一、創建虛擬網絡 下面的說明和框圖使用示例IP 地址范圍。你必須依…

Altium Designer學習筆記12

把幾個層理解下&#xff1a; layer名稱功能說明信息Toplayer信號層銅箔層&#xff0c;電氣連接的層Bottomlayer信號層銅箔層&#xff0c;電氣連接的層Internal Planes內層連接地和電源上&#xff0c;一般情況下不布線&#xff0c;是由整片銅膜組成的Mechanical 1機械層電路板機…

String 、StringBuffer 和 StringBuilder 的區別?

String 使用 String 聲明一個字符串的時候&#xff0c;該字符串會存放在堆中的字符串常量池中。因為在java中所有的String 都是以常量表示&#xff0c;且由 final 修飾&#xff0c;因此在線程池中它的線程是安全的 且 不可變的 。每個 String 在被創建后就不再發生任何變化。 …

mysql按年、季度、月,統計

以下是按年、按季度和按月統計SQL查詢語句&#xff1a; 按年統計&#xff1a; SELECTds.checker,YEAR(ds.create_time) AS settleYear,SUM(ds.quantity) AS quantity,SUM(ds.approval_price) AS approvalPrice FROMdata_settle ds WHEREds.delete_flag 0AND ds.approval_sta…

漏洞盒子公益SRC

漏洞盒子公益SRC&#xff0c;小小地記錄一下第一個月的成果

數據中臺建設方法論

1、數倉的概念和了解--業務的痛點 產生的痛點&#xff1a;數據資產比較模糊、數據的質量比較低、重復建設、代碼的耦合性比較強。 2、數據倉庫中的常見的模型&#xff1a; 1、心型模型&#xff1a;中間是一張事實表&#xff0c;周圍都是維度表。 對于心型模型的主要的特點&a…

面向未來的自動化:擁抱機器人即服務(RaaS)

01. RaaS是什么&#xff1f; 對于希望實現業務流程自動化的公司來說&#xff0c;機器人通常是一筆巨大的資本支出。由于機器人非常昂貴&#xff0c;公司可能需要等待數年才能看到投資回報。正是由于這一現實&#xff0c;許多較小的組織無法投資機器人。 但一些機器人公司正在采…

算法通關村第十二關-青銅挑戰字符串

大家好我是蘇麟 , 今天帶來字符串專題 . 轉換成小寫字母 描述 : 給你一個字符串 s &#xff0c;將該字符串中的大寫字母轉換成相同的小寫字母&#xff0c;返回新的字符串。 題目 : LeetCode 709.轉換成小寫字母 : 709. 轉換成小寫字母 分析 : 這個題可以先遍歷整個字符串…

Mybatis和MybatisPlus:數據庫操作工具的對比

目錄 什么是mybatis 什么是mybatisplus MyBatis-Plus&#xff1a;為簡化數據庫操作而生的強大工具 一、MyBatis-Plus的背景和概述 二、MyBatis-Plus的主要特點 三、如何使用MyBatis-Plus mybatis-Plus的優勢 什么是Hibernate Hibernate&#xff1a;Java開發者的數據持久…

光譜圖像超分 Benchmark

光譜圖像超分 Benchmark 文章目錄 光譜圖像超分 Benchmark0. pioneer工作及綜述基于深度學習的高光譜多光譜融合&#xff08;updating&#xff09;1. 空間光譜圖像超分 &#xff08;to be updated&#xff09;2. 高分辨率多光譜圖像超分&#xff08;to be updated&#xff09;3…

重生之我是一名程序員 39 ——C語言題目之青蛙跳臺階

哈嘍啊大家晚上好&#xff01;今天給大家帶來的是C語言經典題目之青蛙跳臺階。青蛙跳臺階是一個數學問題&#xff0c;也是一個經典的遞歸問題。假設一只青蛙要跳上一個n級臺階&#xff0c;它可以每次跳1級臺階或2級臺階。問&#xff1a;青蛙跳上這個n級臺階總共有多少種不同的跳…

AMESim|學習記錄

此文記錄AMESim學習過程中的各種情況。 目錄 01 王佳. AUV 浮力調節系統設計及控制策略研究[D]. 天津大學, 2017.01 王佳. AUV 浮力調節系統設計及控制策略研究[D]. 天津大學, 2017. 01 王佳. AUV 浮力調節系統設計及控制策略研究[D]. 天津大學, 2017. 開始步入正文 01 王佳.…

【Leetcode合集】14. 最長公共前綴

14. 最長公共前綴 14. 最長公共前綴 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 ""。 示例 …

【UE】用樣條線實現測距功能(下)

目錄 效果 步驟 一、實現多次測距功能 二、通過控件藍圖來進行測距 在上一篇&#xff08;【UE】用樣條線實現測距功能&#xff08;上&#xff09;&#xff09;文章基礎上繼續實現多次測距和清除功能。 效果 步驟 一、實現多次測距功能 打開藍圖“BP_Spline”&#xff0c…

cherry pick的使用

https://blog.csdn.net/weixin_55229531/article/details/128726872