本章主要講述了關于字典的相關知識,字典是python開發的一個重要的資料存儲容器,重點了解字典的存儲方式并能夠靈活的運用到實際的問題中來。
一、字典的概念
1、字典的定義
1. 字典是一種可變的容器,可以存儲任意類型的資料
2. 字典中的每個資料都是用"鍵"(key) 進行索引,而不象序列可以用下标來進行索引
3. 字典中的資料沒有先後順序關系,字典的存儲是無序的
4. 字典中的資料以鍵(key)-值(value)對形式進行映射存儲
5. 字典的鍵不能重複,且隻能用不可變類型作為字典的鍵
2、字典的字面值表示方式
{} 括起來,以冒号(:) 分隔鍵-值對,各鍵-值對用逗号分隔開
3、建立空字典
d = {} # 空字典
d = dict()
4、建立非空字典
d = {'name':'tarena', 'age': 15}
d = {1:'星期一', 2:"星期二"}
# 以下寫法會出現問題(因為鍵不能重複)
d = {'a': 1, 'b': 2, 'a': '一'}
5、字典的構造(建立)函數
1、dict() # 建立空字典,等同于 {}
2、dict(iterable) # 用可疊代對象初始化一個字典
3、dict(**kwargs) # 關鍵字傳參形式生成一個字典
示例:
d = dict()
d = dict([('name', 'tarena'), ('age', 15)])
d = dict(name='tarena', age=15)
6、字典的鍵、值的取值
字典的值(value)可以是任意類型
字典的值可以是布爾值,資料,字元串,None,清單,元組,字典,以及後面要學到的集合,函數,類對象等所有類型
字典的 鍵(key)必須為不可變類型的值
不可變的類型:
bool,int,float,complex,str,tuple,frozenset(固定集合)
包括:None
不能充當鍵的類型有:
清單,字典,集合set
示例:
{“a”: ”a”}
{100: ”100”}
{True: ”True”}
{None: ”abc”}
{(1970,1,1): ”computer year”}
二、字典的基本操作
1、字典的鍵索引
用[] 運算符可以擷取和修改鍵所對應的值
文法:
字典[鍵]
示例:
d = {'name': 'tarena', 'age': 15}
print('姓名:', d['name'], '年齡:', d['age'])
2、添加/修改字典的元素
字典[鍵] = 值
d = {}
d[‘name’] = "xiaoming" # 建立新的鍵值對
d[‘age’] = 15 # 建立新的鍵值對
d[‘age’] = 16 # 修改age鍵所對應的值
鍵索引指派說明:
當鍵不存在時,建立鍵并綁定鍵對應的值
當鍵存在時,修改鍵綁定的對象
3、删除字典的元素
del 語句 可以用來删除字典的鍵
文法:
del 字典[鍵]
示例:
d = {1:"星期一", 2:'星期二'}
del d[2]
4、in 運算符(成員資格判斷運算符)
1. 可以用in運算符來判斷一個鍵是否存在于字典中,如果存在則傳回True,否則傳回False
2. not in 與 in 相反
示例:
d = {1: "One", 2: "Two", "三": 'Three'}
1 in d # True
'二' in d # False
3 not in d # True
'One' in d # False
5、字典的疊代通路(疊代出來的都是鍵)
字典是可疊代對象,字典隻能對鍵進行疊代通路
示例:
d = {1: "One", 2: "Two", "三": 'Three'}
for k in d:
print(k, '對應的值是:', d[k])
三、字典的方法
函數 | 說明 |
---|---|
D代表字典對象 | |
D.clear() | 清空字典 |
D.pop(key) | 移除鍵,同時傳回此鍵所對應的值 |
D.copy() | 傳回字典D的副本,隻複制一層(淺拷貝) |
D.update(D2) | 将字典 D2 合并到D中,如果鍵相同,則此鍵的值取D2的值作為新值 |
D.get(key, default) | 傳回鍵key所對應的值,如果沒有此鍵,則傳回default |
D.keys() | 傳回可疊代的 dict_keys 集合對象 |
D.values() | 傳回可疊代的 dict_values 值對象 |
D.items() | 傳回可疊代的 dict_items 對象 |
示例:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX6tmeNNzaq10MJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO4IDMyIjMxITMxYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
D.get(100,”沒有此鍵值對”) # 如果沒有100這個key,傳回”沒有此鍵值對”
四、字典推導式
字典推導式是用可疊代的對象依次生成字典的表達式
文法:
{ 鍵表達式: 值表達式 for 變量 in 可疊代對象 [if 真值表達式]}
注: [] 及其中的内容代表可省略
說明:
1. 先從可疊代對象中取值
2. 用變量綁定
3. 用if 進行條件判斷,如果為真值則執行下一步
4. 執行'鍵表達式'和 '值表達式' 然後加入到新字典中
示例:
生成一個字典,鍵為1~9的整數,值為鍵的平方
d = {x: x **2 for x in range(1, 10)}
五、字典與清單的比較
1、字典和清單
1. 都是可變對象
2. 索引方式不同,清單用整數索引,字典用鍵索引
3. 字典的查找速度可能會快于清單(重要)
4. 清單的存儲是有序的,字典的存儲是無序的
2、清單 和字典 的内部存儲原理
清單,順序存儲
字典,映射存儲
六、練習集
1、第一題
No = [1001, 1002, 1005, 1008],names = ['Tom', 'Jerry', 'Spike', 'Tyke'],用上面No清單中的資料作為鍵,用names中的資料作為值,生成相應的字典:
如:d = {1001: 'Tom', 1002: 'Jerry', ....}
# 方法1:
d = {No[i]: names[i] for i in range(len(No))}
# 方法2:
d = {n: names[No.index(n)] for n in No}
2、第二題
輸入一些單詞和解釋,将單詞作為鍵,将解釋作為值,将這些資料輸入到字典中,當輸入空的單詞時結束輸入;然後,輸入查詢的單詞,給出單詞對應的解釋。
print("詞典錄入...")
dictionaries = []
while True:
word = input("請輸入單詞:")
if not word:
print("詞典錄入完畢!!")
break
translate = input("請輸入" + word + "的解釋:")
dictionaries = {word: translate}
print("單詞查詢...")
while True:
word = input("請輸入查詢的單詞:")
if not word:
break
print(dictionaries.get(word)) # 查詢不到 則傳回None
3、第三題
輸入任意個學生的資訊:
學生資訊有:
姓名(字元串str)
年齡(整數int)
成績(整數int)
當輸入學生姓名為空時結束輸入
1) 将每個學生的資訊形成字典,存于清單L 中:
如:
[{'name':'xiaozhang', 'age':20, 'score':97},
{'name':'xiaoli', 'age':18, 'score':95},
....
]
2) 以表格的形式列印所有學生的資訊,如下:
+---------------+----------+----------+
| name | age | score |
+---------------+----------+----------+
| xiaozhang | 20 | 97 |
| xiaoli | 18 | 95 |
| ...... | ... | ... |
+---------------+----------+----------+
students_info = []
while True:
n = input("請輸入姓名:")
if not n:
break
a = int(input("請輸入年齡:"))
s = int(input("請輸入成績:"))
students_info.append({"name": n, "age": a, "score": s})
print("""+---------------+----------+----------+
| name | age | score |
+---------------+----------+----------+""")
for x in students_info:
print("+",
(x.get("name")).center(15),
"|",
str(x.get("age")).center(10),
"|",
str(x["score"]).center(10),
"|",
sep='')
print("""+---------------+----------+----------+""")