Python 基礎 - 字典的操作使用
接下來介紹字典,這在未來工作上,會是很常使用的,就來好好了解一下唄…
字典是一個 key(鍵)-value(值) 的數據類型,可以儲存很多訊息
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
---------------執行結果---------------
{'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
Process finished with exit code 0
觀察一下,有發現什麼了嗎?沒錯,字典怎麼沒有按照順序排列呢?
字典的其中一個特性是無順序性的,因為沒有下標,所以不會照順序排列,但仍然可以透過key來查找,字典不像列表是有下標的,可以透過下標來查找位置,先試試用key來查找Tony Stark,查找有二種方法
Method 1:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
print(info["stu1001"]) # 這種查找方式是要百分百確定key有存在於字典的,否則會報錯
print(info)
---------------執行結果---------------
{'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
Tony Stark
Process finished with exit code 0
Method 2:dict.get()
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
print(info.get('stu1001')) # 比較安全查找的方式
print(info.get('stu1004')) # 故意查找不存在的,只會返回none
---------------執行結果---------------
{'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
Tony Stark
None
Process finished with exit code 0
那有沒有一個方法,可以判斷我的字典裡,這個數據存不存在?存在就取值,不存在就建立
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
print('stu1003' in info) # Pyhton2.7版,會寫 info.has_key('stu1003'),效果是一樣的
print('stu1004' in info)
---------------執行結果---------------
{'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers', 'stu1001': 'Tony Stark'}
True
False
Process finished with exit code 0
再把 Tony Stark 改成 東尼史塔克,看看要怎麼修改…
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
info["stu1001"] = "東尼史塔克"
print(info)
---------------執行結果---------------
{'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
{'stu1001': '東尼史塔克', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
Process finished with exit code 0
那再新增一個人員進來呢?
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
info["stu1001"] = "東尼史塔克"
info["stu1004"] = "復仇者聯盟"
print(info)
---------------執行結果---------------
{'stu1002': 'Steve Rogers', 'stu1003': 'Bruce Banner', 'stu1001': 'Tony Stark'}
{'stu1004': '復仇者聯盟', 'stu1002': 'Steve Rogers', 'stu1003': 'Bruce Banner', 'stu1001': '東尼史塔克'}
Process finished with exit code 0
那要在刪除字典中,不想要的資料,要怎麼刪除呢? 總共有三種方法
Method 1:del
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
#print(info["stu1001"])
info["stu1001"] = "東尼史塔克"
info["stu1004"] = "復仇者聯盟"
del info["stu1004"] # Python 內建的通用刪除方法,可以用來刪字典,也可以刪列表,任何物件
print(info)
---------------執行結果---------------
{'stu1002': 'Steve Rogers', 'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner'}
{'stu1002': 'Steve Rogers', 'stu1001': '東尼史塔克', 'stu1003': 'Bruce Banner'}
Process finished with exit code 0
Method 2:dic.pop()
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
#print(info["stu1001"])
info["stu1001"] = "東尼史塔克"
info["stu1004"] = "復仇者聯盟"
info.pop("stu1004") # 一定要指定一個key,不指定就會報錯
print(info)
---------------執行結果---------------
{'stu1001': 'Tony Stark', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
{'stu1001': '東尼史塔克', 'stu1003': 'Bruce Banner', 'stu1002': 'Steve Rogers'}
Process finished with exit code 0
Method 3:dic.popitem()
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info)
#print(info["stu1001"])
info["stu1001"] = "東尼史塔克"
info["stu1004"] = "復仇者聯盟"
info.popitem() # 如果沒指定,就會隨機刪
print(info)
---------------執行結果---------------
{'stu1002': 'Steve Rogers', 'stu1003': 'Bruce Banner', 'stu1001': 'Tony Stark'}
{'stu1003': 'Bruce Banner', 'stu1001': '東尼史塔克', 'stu1004': '復仇者聯盟'}
Process finished with exit code 0
接下來,我們只想打印出,字典中所有的值
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info.values())
---------------執行結果---------------
dict_values(['Tony Stark', 'Steve Rogers', 'Bruce Banner'])
Process finished with exit code 0
看起來成功了,那既然可以只打印值,應該也可以只打印字典中所有的key
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info.keys())
---------------執行結果---------------
dict_keys(['stu1001', 'stu1002', 'stu1003'])
Process finished with exit code 0
唔,成功打印出所有的key了,再來我們來新增一個成員好了
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info.setdefault('stu1007', "Phil Coulson")
print(info)
---------------執行結果---------------
{'stu1003': 'Bruce Banner', 'stu1001': 'Tony Stark', 'stu1007': 'Phil Coulson', 'stu1002': 'Steve Rogers'}
Process finished with exit code 0
唔,看起來也成功新增一個人員了,那假設如果用dict.setdefault('key', 'value') 這種語法,能不能拿來修改已存在的值,來試試唄
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info.setdefault('stu1007', "Phil Coulson")
print(info)
info.setdefault('stu1003', "Nick Fury")
print(info)
---------------執行結果---------------
{'stu1002': 'Steve Rogers', 'stu1007': 'Phil Coulson', 'stu1003': 'Bruce Banner', 'stu1001': 'Tony Stark'}
{'stu1002': 'Steve Rogers', 'stu1007': 'Phil Coulson', 'stu1003': 'Bruce Banner', 'stu1001': 'Tony Stark'}
Process finished with exit code 0
嗯,看起來 stu1003的值,並沒有被改變,所以dict.setdefault('key', 'value)的主要功能就是把不存在於字典中的key,給建立起來
試試更新字典呢?
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info2 = {
'stu1001': "Jarvis",
'stu2002': "Maria Hill",
}
info.update(info2)
print(info)
---------------執行結果---------------
{'stu1002': 'Steve Rogers', 'stu2002': 'Maria Hill', 'stu1001': 'Jarvis', 'stu1003': 'Bruce Banner'}
Process finished with exit code 0
觀察一下,發現當二個字典中,有二個一樣的key時,如果使用了dict.update() 就會被更新了。
以上面代碼為例,這二個字典中,都有一個key叫 stu1001,但二個分別代表不同的值,
info{'stu1001': "Tony Stark"},而 info2{'stu1001': "Jarvis"},當執行info.update(info2)時,是把二個字典給合併了,如果有對到一樣的key就更新,沒有的話,就建立一組新的key-value,這就是dict.update()的作用。
接下來試試dict.items(),觀察一下,有什麼作用
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
print(info.items())
---------------執行結果---------------
dict_items([('stu1003', 'Bruce Banner'), ('stu1001', 'Tony Stark'), ('stu1002', 'Steve Rogers')])
Process finished with exit code 0
唔…看起來是把字典給轉成列表了。
接下來試一下怎麼做初始化字典
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info2 = info.fromkeys([9, 8, 7])
print(info2)
---------------執行結果---------------
{8: None, 9: None, 7: None}
Process finished with exit code 0
咦,奇怪,為什麼不是用info.fromkeys([9, 8, 7])嗎?怎麼打印出來的全都不一樣了,那是因為其實跟info這個字典無關了,所以直接用dict.fromkeys(seq, value=none)來驗証一下吧
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info2 = dict.fromkeys([9, 8, 7], "test")
print(info2)
---------------執行結果---------------
{8: 'test', 9: 'test', 7: 'test'}
Process finished with exit code 0
這次就不透過info.fromkeys()來調用了,直接使用dict.fromkeys(),這樣就完成一個初始化字典啦,並且還直接賦值了。
再來觀察一下,下面這個代碼
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
info2 = dict.fromkeys([9, 8, 7], [1, {"name":"ironman"}, 9527])
print(info2)
info2[8][1]["name"] = "Bruce Lee"
print(info2)
---------------執行結果---------------
{8: [1, {'name': 'ironman'}, 9527], 9: [1, {'name': 'ironman'}, 9527], 7: [1, {'name': 'ironman'}, 9527]}
{8: [1, {'name': 'Bruce Lee'}, 9527], 9: [1, {'name': 'Bruce Lee'}, 9527], 7: [1, {'name': 'Bruce Lee'}, 9527]}
Process finished with exit code 0
有發現什麼嗎?我們原以為是初始化了三個獨立的數據,其實不是的,這個就跟之前講到的淺copy有點類似,看下圖說明好了

dict.fromkeys() 較適用於一層式的字典,多層式的字典就不要用了
再來試一下,字典的循環是怎麼使用
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
for i in info:
print(i)
---------------執行結果---------------
stu1001
stu1003
stu1002
Process finished with exit code 0
咦,只有打印出key,如果也想把值給打印出來呢?
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
for i in info:
print(i, info[i])
---------------執行結果---------------
stu1001 Tony Stark
stu1003 Bruce Banner
stu1002 Steve Rogers
Process finished with exit code 0
還有另一種方法也可以同時打印出 key-value的循環
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
info = {
'stu1001': "Tony Stark",
'stu1002': "Steve Rogers",
'stu1003': "Bruce Banner",
}
for k, v in info.items():
print(k, v)
---------------執行結果---------------
stu1003 Bruce Banner
stu1002 Steve Rogers
stu1001 Tony Stark
Process finished with exit code 0
那這二種有什麼差別呢?其實第一種的效率比較好,因為第一種是透過key的方式去取值,但下面多了一個把字典轉成列表的過程,如果當數據量較大時,就不適合用第二種方式。
接下來,再寫稍稍複雜一點的,巢狀式(嵌套)(nested)字典,並修改掉其中一個值
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
shopping_online_catalog = {
"歐美": {
"www.amazon.com": ["美國最大購物網站", "亞馬遜"],
"www.ebay.com": ["美國知名購物網站", "eBay"],
"www.kickstarter.com": ["美國募資平台", "有很多有趣的專案在募資"]
},
"日本": {
"media.buyee.jp": ["日本代購網站", "不會日文也可以買,日本雅虎官方合作夥伴"],
"global.rakuten.com": ["日本樂天網站", "好像是日本第一大購物網站?"]
},
"大陸": {
"www.taobao.com": ["大陸淘寶網", "應該是大陸最大的購物網站吧?!"],
"www.jd.com": ["大陸京東商城", "其實我也不知道它在賣啥的"]
}
}
---------------執行結果---------------
{'大陸': {'www.taobao.com': ['大陸淘寶網', '應該是大陸最大的購物網站吧?!'], 'www.jd.com': ['大陸京東商城', '我只知道他們技術很牛逼']}, '日本': {'media.buyee.jp': ['日本代購網站', '不會日文也可以買,日本雅虎官方合作夥伴'], 'global.rakuten.com': ['日本樂天網站', '好像是日本第一大購物網站?']}, '歐美': {'www.amazon.com': ['美國最大購物網站', '亞馬遜'], 'www.kickstarter.com': ['美國募資平台', '有很多有趣的專案在募資'], 'www.ebay.com': ['美國知名購物網站', 'eBay']}}
Process finished with exit code 0
key 盡量不要使用中文字,很容易因為字符編碼不一致,而導致取不到值或是程序失敗
參考資料:
Python 基礎 - 字典的操作使用的更多相关文章
- Python 基礎 - 字符串常用操作
字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...
- Python 基礎 - 文件的操作
在來我們來玩一下文件操作,這個在未來工作上,也是會很常用到的功能 Python2.7中,可以用file()來打開文件,而在Python3中,一律都是用open(),接下來在當前目錄下,先建立一個空文件 ...
- Python 基礎 - for流程判斷
今天介紹另一個循環判斷式 for循環,首先,先寫一個很簡單的 for循環的代碼 #!/usr/bin/env python3 # -*- coding:utf-8 -*- for i in range ...
- Python 基礎 - if else流程判斷
hmm~前面講了那麼多,終於可以稍稍的正式進入另一個階段,沒錯,要開始寫判斷式了 這次先從最簡單的判斷式開始,if else 開始- Go 首先,之前有寫有一個簡單的互動式 用戶輸入 的代碼,忘記了嗎 ...
- Python基础学习----字典常用操作
字典的常见操作: # 字典: # 格式:{键值对,键值对} dict_demo={"name":"bai-boy","age":17} # ...
- Python 基礎 - 字符轉編碼操作
回顧字符編碼的前世今生 ASCII 只能儲英文或特殊字符,只占一個字節,一個字節8bit,不能儲中文,所以才出現Unicode Unicode 不管是中文或英文,都是占二個字節,一個字節8bit UT ...
- Python 基礎 - 文件操作_v2
嗯,那如何要把游標的位置給打印來? #!/usr/bin/env python3 # -*- coding:utf-8 -*- f = open('test', 'r') print(f.tell() ...
- Python 基礎 - 數據類型
標準數據類型 Python3 中有六個標準的數據類型 1 Number(數字) 2 String(字符串) 3 List (列表) 4 Tuple (元組) 5 Sets (集合) 6 Diction ...
- Python入门之字典的操作详解
这篇文章主要介绍了Python 字典(Dictionary)的详细操作方法,需要的朋友可以参考下: Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一 ...
随机推荐
- 国内技术管理人员批阅google的“春运交通图”项目(大公司下的高效率)<转载>
在整理一份报告的时候,偶然看到2008年春节期间google推出的“春运交通图”项目建设历程报道,很受启发,随以国内的技术管理人员眼光批阅了这篇文章,同时也是自嘲吧. 以下黑色字体是原报道,红色字体是 ...
- Volley的GET和POST方法
首先记得加上权限 <uses-permission android:name="android.permission.INTERNET"/> XML代码 <?xm ...
- BookRent借阅管理
最近整了个BookRent的小应用,单机版.连本地sqlite db.wpf界面,其中涉及到一些有趣的小功能和小坑,简单小结一下. 项目结构是wpf ui->view model->rep ...
- Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系
前言: 在嵌入式开发中,如uboot的移植,kernel的移植都需要对Flash 有基本的了解.下面细说一下标题中的中Flash中的关系 一,Flash的内存存储结构 flash按照内部存 ...
- c++内存对齐
内存对齐原则: 1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置.如在32bit的机 ...
- one recursive approach for 3, hdu 1016 (with an improved version) , permutations, N-Queens puzzle 分类: hdoj 2015-07-19 16:49 86人阅读 评论(0) 收藏
one recursive approach to solve hdu 1016, list all permutations, solve N-Queens puzzle. reference: t ...
- 【转】Java反射 之 反射基础
一.反射 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 读IT小小鸟有感
第一次阅读<我是一只IT小小鸟>是在老师的推荐下的,我是一名软工大一新生,那天在课堂上听到了这本书,由于是10年前的老书,要找到它非常不易,终于在网上看到一些部分电子档. ...
- JAVA编程讲座-吴老
JAVA系列公开课第4讲:多态系列课程:从JAVA编程零基础讲起,同时结合工作中遇到的具体实例,语言清晰易懂,连续10周+深入讲解,打下编程基础,让我们一起打来自动化测试的大门时间:4月25日(周一) ...
- X3850M2安装CertOS 7 KVM 2--VNC
需要安装远程桌面,否则无鼠标的日子比较难. VNC的安装需要步骤较多,重点参考以下文章: http://www.itzgeek.com/how-tos/linux/centos-how-tos/con ...