字典

字典(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]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章