Python之字典

字典:無序的,可變的鍵值對集合,字典是另外一種可變容器模型,且可存儲任意類型對象
字典的每一個鍵值(key=>value)對用冒號(:)分割,每一個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式以下所示:
# d = {key1 : value1, key2 : value2 }
# 鍵必須是惟一的,但值則沒必要。
# 值能夠取任何數據類型,但鍵必須是不可變的,如字符串,數字或元組。

1 info = {"name": "cq", "age": 18, "class": "first"} 2 print(info, type(info)) 3 print(info['name']) 4 print(info['age'])

輸出結果:數組

{'name': 'cq', 'age': 18, 'class': 'first'} <class 'dict'>
cq
18數據結構

# 方式2
# Python 字典 fromkeys() 函數用於建立一個新字典,以序列 seq 中元素作字典的鍵,value 爲字典全部鍵對應的初始值。
# fromkeys()方法語法:
# dict.fromkeys(seq[, value])

# 參數:
# seq -- 字典鍵值列表。
# value -- 可選參數, 設置鍵序列(seq)的值。

# 返回值:
# 該方法返回一個新字典
# fromkeys:是一個靜態方法,類和對象均可以調用
1 seq = ("name", "age", "class") 2 dic = dict.fromkeys(seq) 3 print("新字典爲:: ", dic) 4 
5 dic = dict.fromkeys(seq, 10) 6 print("新的字典爲:: ", dic) 7 
8 dic = dict.fromkeys([1, 2, 3], 20) 9 print("新的字典:: ", dic)

輸出結果:函數

新字典爲:: {'name': None, 'age': None, 'class': None}
新的字典爲:: {'name': 10, 'age': 10, 'class': 10}
新的字典:: {1: 20, 2: 20, 3: 20}spa

 # 字典定義的注意事項
1:key不能被重複 若是重複了,後值會把前值覆蓋掉 
1 dic = {1: "a", 2: "b", 1: "c"}
2 print(dic)
輸出結果:
{1: 'c', 2: 'b'}

  2:key必須是任意不可變類型code

 

Python字典的實現原理對象

 

# 字典類型是Python中最經常使用的數據類型之一,它是一個鍵值對的集合,字典經過鍵來索引,關聯到相對的值
# 理論上它的複雜度是O(1)
# 那麼dict的內部實現原理是什麼呢?
# 在Python中,字典是經過哈希表實現的。
# 哈希表(hash tables)也叫散列表,根據關鍵值對(Key-value)而直接進行訪問的數據結構。它經過把key和value
# 映射到表中的一個位置來訪問記錄,這種查詢速度很是快,更新也快。而這個映射函數叫作哈希函數,存放值的數組叫作
# 哈希表,哈希函數的實現方式決定了哈希表的搜索效率,具體實現過程是:
# 1:數據添加:把key經過哈希函數轉換成一個整型數字,而後就將這個整型數字對數組長度進行取餘,取餘結果就當作數組
# 的下標,將value存儲在以該數字爲下標的數組空間裏

# 2:數據查詢:再次使用哈希函數將key轉換爲對應的數組下標,並定位到數組的位置獲取value

# 可是,對key進行hash的時候,不一樣的key可能hash出來的結果是同樣的,尤爲是數據量增多的時候這個問題叫作哈希衝突
# 若是解決這種衝突狀況呢?一般的作法有兩種,一種是連接法,另外一種是開放尋址法,Python選擇後者

# 開放尋址法中,全部的元素都存放在散列表中,當產生哈希衝忽然時,經過一個探測函數計算出下一個候選位置,若是下一個獲選
# 位置仍是有衝突,那麼不斷的經過探測函數往下找,直到找到一個空槽來存放插入元素


字典的經常使用操做
# 增長操做
# dict[key] = value
# 當key在原字典中不存在的時候,即爲新增操做
 
1 dic = {"name": "xq", "age": 18} 2 print(dic, id(dic)) 3 
4 dic["height"] = 180
5 print(dic, id(dic))
輸出結果:

{'name': 'xq', 'age': 18} 31652432
{'name': 'xq', 'age': 18, 'height': 180} 31652432blog

# 刪除操做
# del dic[key]
# key必須存在,不然就會報一個keyerror的一個錯誤
1 dic = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} 2 # 刪除單個元素
3 del dic['Name'] 4 print("刪除Name關鍵字:: ", dic) 5 
6 # 刪除字典
7 del dic 8 # print(dic) 此時再打印訪問字典就會報錯,dic is not defined
輸出結果:
刪除Name關鍵字::  {'Age': 7, 'Class': 'First'}
# 字典clear()方法
# clear()是清空字典內的全部元素的,返回值爲None
# 注意:字典自己還存在,只是字典裏的內容被清空,注意和del的區別
1 dic = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} 2 returnValue = dic.clear() 3 print("returnValue:: ", returnValue)

輸出結果:索引

returnValue::  None字符串

 # 字典的clear()有什麼特色呢?get

1 dic = {"name": "xq", "sex": "female", "age": 18} 2 dic1 = dic 3 dic.clear() 4 print("dic:: ", dic) 5 print("dic1:: ", dic1) 6 # 能夠發現當原字典dic被引用時,想清空原字典中的元素,用clear()方法,dic1字典中的元素也同時被清除了。

輸出結果:

dic:: {}
dic1:: {}

# 字典pop()方法 dic.pop(key[, default])
# 移除字典數據pop()方法的做用是:刪除指定給定鍵所對應的值,返回這個值並從字典中把它移除。
# 注意字典pop()方法與列表pop()方法做用徹底不一樣。
1 dic = {"a": 1, "b": 2} 2 result = dic.pop("a") 3 print("result:: ", result) 4 print("dic:: ", dic) 5 # 若是給定的key不存在,則返回給定的默認值,若是沒有給定默認值,則報錯
6 dic = {"a": 1, "b": 2} 7 result = dic.pop("a1", 666) 8 print("result:: ", result) 9 # dic.pop("a1") 會報錯

輸出結果:

result:: 1
dic:: {'b': 2}
result:: 666

 
# 字典popitem()方法
# Python 字典 popitem() 方法隨機返回並刪除字典中的一對鍵和值(通常刪除末尾對)。
# 若是字典已經爲空,卻調用了此方法,就報出KeyError異常。
1 dic = {"name": "xq", "sex": "female", "age": 18} 2 result = dic.popitem() 3 print("result:: ", result) 4 print("dic:: ", dic)

輸出結果:

result:: ('age', 18)
dic:: {'name': 'xq', 'sex': 'female'}

# 字典修改操做
# 只能修改值,而不能修改key
# 修改單個鍵值對:
# dic[key] = value
# 直接設置,若是key不存在,則新增,若是存在,則修改
 
1 dic = {"name": "xq", "age": 18} 2 dic["age"] = 21
3 print("修改後的字典爲:: ", dic)
輸出結果:
修改後的字典爲::  {'name': 'xq', 'age': 21}
# 批量修改鍵值對
# oldDic.update(newDic)
# 根據新的字典,批量更新舊字典中的鍵值對
# 若是舊字典中沒有對應的key值,則新增鍵值對
1 oldDic = {"name": "xq", "age": 18} 2 newDic = {"age": 21, "address": "beijing"} 3 oldDic.update(newDic) 4 print("更新後字典爲:: ", oldDic)

輸出結果:

更新後字典爲::  {'name': 'xq', 'age': 21, 'address': 'beijing'}

# 字典的查找操做
# 1:獲取單個值的狀況
# 方式1: dic[key]
# 若是key不存在則會報錯
dic = {"name": "xq", "age": 18}
print(dic["age"])
 
# 方式2:
# dict.get(key, default=None)
# 參數:
# key -- 字典中要查找的鍵。
# default -- 若是指定鍵的值不存在時,返回該默認值值。

# Python 字典 get() 函數返回指定鍵的值,若是值不在字典中返回默認值
 
1 dic = {"name": "xq", "age": 18, "address": "beijing"} 2 v = dic.get("age") 3 print("v的返回值:: ", v) 4 result = dic.get("class", 666) 5 print(result, dic)
輸出結果:

v的返回值:: 18
666 {'name': 'xq', 'age': 18, 'address': 'beijing'}

# 方式3:
# dict.setdefault(key, default=None)
# 參數:
# key -- 查找的鍵值。
# default -- 鍵不存在時,設置的默認鍵值。

# Python 字典 setdefault() 方法和get()方法相似, 若是鍵不存在於字典中,將會添加鍵並將值設爲默認值。
1 dic = {"name": "xq", "age": 18, "address": "beijing"} 2 res = dic.setdefault("age") 3 print("res的返回值:: ", res) 4 result = dic.setdefault("class", 666) 5 print(result, dic)

輸出結果:

res的返回值:: 18
666 {'name': 'xq', 'age': 18, 'address': 'beijing', 'class': 666}

 
# 查詢全部的值
# 查詢全部的鍵
# 查詢全部的鍵值對

# Python 字典 values() 方法返回一個迭代器,可使用 list() 來轉換爲列表,列表爲字典中的全部值。
# 注意:Python2.x 是直接返回列表
# 語法
# dict.values()

# 返回值:
# 返回迭代器。
 
1 dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'} 2 print("字典全部值爲::", list(dic.values()))

輸出結果:字典全部值爲:: ['female', 7, 'Zara']

# Python3 字典 keys() 方法返回一個迭代器,可使用 list() 來轉換爲列表。
# 注意:Python2.x 是直接返回列表

# keys()方法語法:
# dict.keys()

# 返回值:
# 返回一個迭代器
 
1 dic = {"name": "xq", "age": 18, "address": "beijing"} 2 print("字典全部的key值:: ", list(dic.keys()))
輸出結果爲:字典全部的key值::  ['name', 'age', 'address']

# Python 字典 items() 方法以列表返回可遍歷的(鍵, 值) 元組數組。
# 注意:Python2.x 是直接返回列表
# items()方法語法:
# dict.items()

# 返回值:
# 返回可遍歷的(鍵, 值) 元組數組
1 dic = {"name": "xq", "age": 18, "address": "beijing"} 2 print("字典的全部鍵值對:: ", dic.items()) 3 
4 for i, j in dic.items(): 5     print(i, "\t:", j)

輸出結果:

字典的全部鍵值對:: dict_items([('name', 'xq'), ('age', 18), ('address', 'beijing')])
name : xq
age : 18
address : beijing

 
# 另外,這幾個函數,Python2.x與Python3.x是有必定區別的,請看代碼
Python2.x版本下
 1 dic = {"name": "xq", "age": 18, "address": "beijing"}  2 
 3 # 獲取全部的值
 4 vs = dic.values()  5 
 6 # 獲取全部的key值
 7 ks = dic.keys()  8 
 9 # 獲取全部的鍵值對
10 its = dic.items() 11 
12 print(dic) 13 print(vs) 14 print(ks) 15 print(its) 16 
17 # 此時字典增長一項
18 dic["sex"] = "female"
19 
20 print(dic) 21 print(vs) 22 print(ks) 23 print(its)
輸出結果:

{'age': 18, 'name': 'xq', 'address': 'beijing'}
[18, 'xq', 'beijing']
['age', 'name', 'address']
[('age', 18), ('name', 'xq'), ('address', 'beijing')]
{'age': 18, 'sex': 'female', 'name': 'xq', 'address': 'beijing'}
[18, 'xq', 'beijing']
['age', 'name', 'address']
[('age', 18), ('name', 'xq'), ('address', 'beijing')]

 

Python3.x版本下的

 
 1 dic = {"name": "xq", "age": 18, "address": "beijing"}  2 
 3 # 獲取全部的值
 4 vs = dic.values()  5 
 6 # 獲取全部的key值
 7 ks = dic.keys()  8 
 9 # 獲取全部的鍵值對
10 its = dic.items() 11 
12 print(dic) 13 print(vs) 14 print(ks) 15 print(its) 16 
17 # 此時字典增長一項
18 dic["sex"] = "female"
19 
20 print(dic) 21 print(vs) 22 print(ks) 23 print(its)
輸出結果:

{'name': 'xq', 'age': 18, 'address': 'beijing'}
dict_values(['xq', 18, 'beijing'])
dict_keys(['name', 'age', 'address'])
dict_items([('name', 'xq'), ('age', 18), ('address', 'beijing')])
{'name': 'xq', 'age': 18, 'address': 'beijing', 'sex': 'female'}
dict_values(['xq', 18, 'beijing', 'female'])
dict_keys(['name', 'age', 'address', 'sex'])
dict_items([('name', 'xq'), ('age', 18), ('address', 'beijing'), ('sex', 'female')])

看打印的結果能夠看出:Python2.x版本下,全部的鍵、值和鍵值對結果都是以列表形式呈現的,而Python3.x版本下面都是迭代器形式呈現,並且當咱們
往字典裏面增長鍵值對的時候,Python2.x版本下面並不會把新增的鍵值對放到咱們所獲取的鍵、值和鍵值對裏面,Python3.x則不是

# 遍歷
# 1:先遍歷全部的key,而後根據key獲取對應的值
dic = {"name": "xq", "age": 18, "address": "北京"}

# 先獲取全部的keys
keys = dic.keys()

# 遍歷全部的keys
for key in keys:
print(key, "\t:", dic[key])
 
# 2:直接遍歷全部的鍵值對
dic = {"name": "xq", "age": 18, "address": "北京"}

for x,y in dic.items():
print(x, "\t:", y)
 
dic = {"name": "xq", "age": 18, "address": "北京"}
# 計算
# len(info)
# 計算鍵的個數
print(len(dic))


# 斷定
# x in dic
# 斷定dic中的key,是否存在x
print("name" in dic)


# x not in dic
# 斷定dic中的key,是否不存在x
print("name" not in dic)

# dic.has_key(key)
# 已通過期,建議使用in來代替,Python2.x還可使用
相關文章
相關標籤/搜索