字典(dict())
引入
爲什麼要使用字典
# 1.加入存在以下列表
li = ['pyth', 'java', 'c']
li.sort() # 若li發生變化將很難通過索引進行修改
# 2.假如統計學生信息,包括學號、姓名、年齡
li = [
[20190101, "Tom", 18],
[20190201, "Jack", 21],
...
[20190605, "mary", 23]
]
# 循環遍歷,十分複雜
# 考慮新的數據結構,字典
# 字典是列表以外python中使用最靈活的內置數據類型
# 字典是一種可變的數據類型
和列表的區別
- 列表有序,字典無序
- 列表通過索引(偏移)訪問元素,字典通過鍵(key)訪問元素
字典基本格式
info = {key1:value1, key2:value2, key3:value3, ..., keyn:valuen}
key:value ---> 鍵值對
值可以取任意數據類型,但鍵不可以,必須爲不可變數據類型,即key必須可哈希。
可哈希—>不可變
不可哈希—>可變
特點
- 1.key:value,鍵值對之間用冒號(:)連接
- 2.key:value 組成字典的一個元素
- 3.鍵值對之間用逗號(,)隔開
- 4.整個字典用花括號({})包裹
字典的創建
空字典
dic = {}
print(type(dic))
<class 'dict'>
多元素字典
dic = {"1": 1, "2": 2}
print(type(dic))
# <class 'dict'>
print(len(dic))
# 2 長度爲鍵值對的數量
print(dic[0])
File "D:/python/test1/day04.py", line 8, in <module>
print(dic[0])
KeyError: 0 # 只能通過鍵去查詢,不能通過索引,因爲是無序的
print(dic["1"])
# 1
強轉
dic = dict(id=20190101, name="Tom", age=18) # 通過函數進行強轉
print(dic)
# {'id': 20190101, 'name': 'Tom', 'age': 18}
key = ("id", "name", "age")
value = (20190101, "Tom", 18)
tp = tuple(zip(key, value))
print(tp, type(tp))
tp1 = dict(tuple(zip(key, value)))
print(tp1, type(tp1))
# (('id', 20190101), ('name', 'Tom'), ('age', 18)) <class 'tuple'>
# {'id': 20190101, 'name': 'Tom', 'age': 18} <class 'dict'>
print(dict([("id", 20190101), ("name", "Tom")])) # 必須使用單參數,若存在多個參數要用方括號或括號包裹起來
# {'id': 20190101, 'name': 'Tom'}
通過字典的fromkeys方法創建字典
# 格式:
dict.fromkeys(seq, val=None)
- 創建並返回一個字典
- 以seq中的元素作爲該字典的鍵
- val的值作爲該字典中所有鍵對應的初始值,若不提供,默認爲None
dic = dict.fromkeys("hello") # 只能傳遞最多兩個參數,若需傳遞多個鍵,要用括號括起來
print(dic)
# {'h': None, 'e': None, 'l': None, 'o': None}取出序列中的所有元素作爲鍵創建字典,初始值爲None
字典的常見操作
增
- 直接添加鍵值對(dic[key] = value)
- 通過使用變量名[“鍵”] = “值”
- 如果key不存在,新建鍵值對(key:value)
- 如果key存在則更新值
- 通過使用變量名[“鍵”] = “值”
dic = {}
dic["id"] = 20190101
dic["name"] = "Tom"
dic["age"] = 21
dic["age"] = 22
print(dic)
# {'id': 20190101, 'name': 'Tom', 'age': 22}
練習
# 創建一個列表,列表的每個元素都是擁有相同鍵的字典,值由用戶輸入
li = []
while True:
id1 = int(input("請輸入id,輸入0退出"))
if id1 == 0:
break
name = input("請輸入姓名")
age = int(input("請輸入年齡"))
dic = {}
dic["id"] = id1
dic["name"] = name
dic["age"] = age
li.append(dic)
print(li)
# 結果舉例
# [{'id': 111, 'name': 'liyue', 'age': 21}, {'id': 651321, 'name': 'yunlong', 'age': 33}, {'id': 777, 'name': 'qijiang', 'age': 24}]
-
dict.update(dic)
把字典dic中的鍵值對(key:value)更新到dict中
- 兩個字典的鍵完全不同,則將dic的鍵值對全部添加至dict中
- 存在相同的鍵,則更新dict中對應的值
dic = {"job": "IT", "hobby": "Read"}
dic2 = {"id": 20190101, "name": "jack", "age": 17}
dic2.update(dic)
print(dic2)
# {'id': 20190101, 'name': 'jack', 'age': 17, 'job': 'IT', 'hobby': 'Read'}
dic3 = {"name": "apple", "hobby": "game"}
dic2.update(dic3)
print(dic2)
# {'id': 20190101, 'name': 'apple', 'age': 17, 'job': 'IT', 'hobby': 'game'}
刪
- dict.pop()
- 格式:
dict.pop(key[, default])
- 如果key存在於dict中,刪除並返回dict[key]
- 如果不存在,給出默認值則返回默認值,未給出默認值,報錯
- 格式:
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.pop("name"))
print(dic)
# jack
# {'id': 20190101, 'age': 17}
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.pop("age", 23))
# 17 若key存在則返回key對應的值
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.pop("job", 23))
# 23 若key不存在則返回默認值
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.pop("job"))
# 若key不存在且未給出默認值,則報錯
Traceback (most recent call last):
File "D:/python/test1/day04.py", line 111, in <module>
print(dic.pop("job"))
KeyError: 'job'
- dict.popitem()
- 隨機刪除一對鍵值對,實際爲刪除可視的最後一個鍵值對,由於字典爲無序的,所以爲隨機刪除
- 有返回值,元組
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.popitem())
print(dic)
# ('age', 17)
# {'id': 20190101, 'name': 'jack'}
dic = {"id": 20190101, "name": "jack", "age": 17}
key, value = dic.popitem()
print(key, value)
# age 17
-
del
- del dict[key] 刪除某個鍵
- del dict 直接刪除字典
-
dict.clear()
- 清空列表
- 無返回值
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.clear())
# None
改
- 直接修改
dic = {"id": 20190101, "name": "jack", "age": 17}
dic["id"] = 555 # 直接通過key對value進行修改
print(dic)
# {'id': 555, 'name': 'jack', 'age': 17}
- dict.setdefault()
- 鍵存在,不改動,返回字典中的值
- 不存在,在字典中添加相應的鍵值對,並返回相應的值
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.setdefault("name", "jack")) # 鍵存在
# jack
print(dic)
# {'id': 20190101, 'name': 'jack', 'age': 17}
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.setdefault("kkx", "xly")) # 鍵不存在
# xly
print(dic)
# {'id': 20190101, 'name': 'jack', 'age': 17, 'kkx': 'xly'}
練習
# 先創建一個列表,列表的每個元素都是擁有相同鍵的字典,值由用戶輸入。然後再根據id對相應字典的值進行修改
li = []
while True:
id1 = int(input("請輸入id,輸入0退出"))
if id1 == 0:
break
name = input("請輸入姓名")
age = int(input("請輸入年齡"))
dic = {}
dic["id"] = id1
dic["name"] = name
dic["age"] = age
li.append(dic)
print(li)
while True:
id2 = int(input("請輸入要修改的字典的id,輸入0退出"))
if id2 == 0:
break
sr = input("請輸出你要修改的value對應的key")
sr2 = input("請輸入修改後的value")
for i in li:
if id2 == i['id']:
i[sr] = sr2
print(li)
# 創建列表
# [{'id': 4396, 'name': 'mingkai', 'age': 29}, {'id': 777, 'name': 'dongwei', 'age': 28}, {'id': 666, 'name': 'liyue', 'age': 21}]
# 修改後
# [{'id': 4396, 'name': 'mingkai', 'age': 29}, {'id': 777, 'name': 'dongwei', 'age': '30'}, {'id': 666, 'name': 'yuege', 'age': 21}]
查
字典值的訪問
- 直接通過字典的key訪問value
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic["id"]) # 通過鍵查詢值
# 20190101
print(dic["kkx"]) # 鍵不存在,報錯
Traceback (most recent call last):
File "D:/python/test1/day04.py", line 141, in <module>
print(dic["kkx"])
KeyError: 'kkx'
-
dict.get()訪問value
-
語法格式
dict.get(key[, default])
-
不確定字典中是否存在某個鍵而又想對其進行操作,比如獲取值—>get方法
-
如果當key不存在的時候,不會拋出異常,返回None
-
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.get("id")) # key存在返回值
# 20190101
print(dic.get("kkx")) # key不存在,默認返回None,若設置default,則返回default
# None
- 遍歷
- dict.keys()
- dict.values()
- dict.items()
dic = {"id": 20190101, "name": "jack", "age": 17}
print(dic.keys(), type(dic.keys()))
# dict_keys(['id', 'name', 'age']) <class 'dict_keys'>
for key in dic.keys():
print(key, end=" ")
# id name age
for value in dic.values():
print(value, end=" ")
# 20190101 jack 17
for item in dic.items():
print(item, end=" ")
# ('id', 20190101) ('name', 'jack') ('age', 17)
for key, value in dic.items():
print(key,":",value)
# id : 20190101
# name : jack
# age : 17
練習
li = [23, 34, 45, 22, 67, 89, 90, 99, 66, 45]
dic = {">=60": [x for x in li if x >= 60], "<60": [x for x in li if x < 60]}
print(dic)
# {'>=60': [67, 89, 90, 99, 66], '<60': [23, 34, 45, 22, 45]}
90101) ('name', 'jack') ('age', 17)
for key, value in dic.items():
print(key,":",value)
# id : 20190101
# name : jack
# age : 17
練習
li = [23, 34, 45, 22, 67, 89, 90, 99, 66, 45]
dic = {">=60": [x for x in li if x >= 60], "<60": [x for x in li if x < 60]}
print(dic)
# {'>=60': [67, 89, 90, 99, 66], '<60': [23, 34, 45, 22, 45]}