16_字典(dict)


時間:2018-11-03 作者:魏文應


一、字典

什么是字典?

  • 字典屬于一種新的數(shù)據(jù)結構,稱為映射(mapping)。
  • 字典的作用和列表類似,都是用來存儲對象的容器。
  • 列表存儲數(shù)據(jù)的性能很好,但是查詢數(shù)據(jù)的性能很差。
  • 在查詢元素時,字典的效率是非常快的。
  • 在字典中,每一個元素都有一個唯一的名字,通過這個唯一的名字,可以快速的查找到指定的元素。

在字典中,可以保存多個對象,每個對象都會有一個唯一的名字:

  • 這個唯一的名字,我們稱其為 鍵(key),通過 key 可以快速的查詢 value 。
  • 這個對象,我們稱其為值(value)。
  • 所以字典,我們也叫做 鍵值對(key-value) 結構 。
  • 每一個鍵值對,我們稱其為一項(item)。

創(chuàng)建字典

字典通過大括號 { } 進行創(chuàng)建,例如:

d = {} # 創(chuàng)建了一個空字典

字典創(chuàng)建的語法如下:

# 字典的值可以是任意對象
# 字典的鍵可以是任意的不可變對象(int、str、bool、tuple ...)
#     字典的鍵不能重復,一般用字符串 str。
{key:value, key:value, key:value}

例如:

d = {
    'name': '孫悟空',
    'age': 18,
    'gender': '男'
}

print(d['name'], d['age'], d['gender'])

通過 索引到了 ,打印結果如下:

孫悟空 18 男

dict() 函數(shù)創(chuàng)建字典

使用 dict() 函數(shù)創(chuàng)建字典:

d = dict(name='孫悟空', age=18, gender='男')
print(d, type(d))

這種方式創(chuàng)建的字典,key 都是字符串,打印結果如下:

{'name': '孫悟空', 'age': 18, 'gender': '男'} <class 'dict'>

dict() 函數(shù),也可以將一個包含有 雙值子序列的序列 轉換為字典:

d = dict([('name', '孫悟空'), ('age', 18)])
print(d, type(d))

子序列中,前面一個元素為鍵,后面一個元素為值,打印結果如下:

{'name': '孫悟空', 'age': 18} <class 'dict'>

雙值序列

序列中只有兩個字值的序列叫做 雙值序列,比如下面的都是雙值序列:

[1, 3]
['a', 1]
'ab'

子序列

如果序列中的元素也是序列,那么稱這個元素為 子序列。比如:

[(1, 3), (3, 5)]

獲取鍵值對個數(shù)

可以通過 len() 函數(shù),獲取字典中鍵值對的個數(shù),比如:

d = {'a':1, 'b':2, 'c':3}
print(len(d))

這就獲取了字典 d 中的鍵值對個數(shù),打印結果如下:

3

檢查是否包含某個鍵

可以使用 in 檢查字典中是否包含某個鍵,比如:

d = {'a': 1, 'b': 2, 'c': 3}
print('hello' in d)

上面,檢查 hello 這個鍵在不在 d 這個字典中,打印結果如下:

False

get() 方法獲取鍵

可以使用 get() 方法,來獲取鍵,如果鍵不存在,返回 None 。比如:

d = {
    'name': '孫悟空',
    'age': 18,
    'gender': '男'
}

print(d.get('name'))  # 返回鍵值孫悟空
print(d.get('hello'))  # hello 鍵沒有,返回 None
print(d.get('hello', '沒有hello'))  # 沒有hello鍵時,返回 '沒有hello'

如果直接使用 d['hello'] 去索引字典,程序會因為字典沒有這個鍵而報錯,通過get()方法則不會報錯,打印結果如下:

孫悟空
None
沒有hello

修改字典

可以通過 d[key] = value 的方式,來進行字典元素值的修改:

d = {'name': '孫悟空','age': 18,'gender': '男'}
d['name'] = 'sunwukong'
print(d)

上面,修改了鍵為 name 的值,打印結果如下:

{'name': 'sunwukong', 'age': 18, 'gender': '男'}

如果沒有對應的鍵,則在字典末尾自動添加,比如:

d = {'name': '孫悟空','age': 18,'gender': '男'}
d['address'] = '花果山'
print(d)

上面,因為沒有 address 這個鍵,所以,就自動在末尾添加一個鍵值對 'address': '花果山',打印結果如下:

{'name': '孫悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

可以使用 setdefualt(key[, default]) 方法,來向字典添加 key-value :

  • 如果 key 已經(jīng)存在于字典中,則返回 key 值,不會對字典做任何操作。
  • 如果 key 不存在,則向字典中添加這個 key ,并設置 value 。
d = {'name': '孫悟空', 'age': 18, 'gender': '男'}
d.setdefault('name', '豬八戒')
print(d)
d.setdefault('address', '花果山')
print(d)

所以,打印結果如下:

{'name': '孫悟空', 'age': 18, 'gender': '男'}
{'name': '孫悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

合并字典

可以使用 update() 方法,合并字典,如果遇到相同的鍵,則更新這個鍵的值。比如:

d = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
d2.update(d)
print(d2)

d 被合并到了 d2 后面,相同的鍵名 a 的對應的值被更新了,打印結果如下:

{'d': 4, 'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3}

刪除字典中的鍵值對

可以使 del 刪除字典中的一個鍵值對,例如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['a']
print(d)

上面,就會把鍵值對 'a': 1 刪除掉,打印結果如下:

{'b': 2, 'c': 3}

如果沒有對應的鍵名,則會報錯,比如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['f']    # 這里會報錯

還可以使用 popitem(), 隨機刪除 字典中的一個鍵值對,一般都會刪除最后一個鍵值對:

  • 刪除之后,它會將刪除的 key-value 作為返回值返回。
  • 返回的是一個元組,元組中有兩個元素,第一個是已經(jīng)刪除的 key,第二個是刪除的 value 。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.popitem()
print('result =',result)
print(d)

打印結果如下:

result = ('c', 3)
{'a': 1, 'b': 2}

還可以使用 pop() 方法進行刪除指定的鍵值對:

  • 根據(jù) key 刪除字典中的 key-value 。
  • 如果刪除不存在的 key ,會拋出異常。
  • 如果指定了默認值,當遇到不存在的 key 時,不會報錯,而是直接返回默認值。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.pop('a')
print('result =', result)
print(d)
result = d.pop('f', '鍵值不存在')
print('result =', result)

打印結果如下:

result = 1
{'b': 2, 'c': 3}
result = 鍵值不存在

清空字典(clear)

可以使用 clear() 方法,清空字典內的所有鍵值對:

d = {'a': 1, 'b': 2, 'c': 3}
d.clear()
print(d)

上面,清空了字典 d 內的所有鍵值對,打印結果如下:

{}

淺復制

可以使用 copy() 方法進行復制操作,將一個字典 d 復制到 d2 中。注意:

  • 淺復制只是簡單復制對象的值,如果值是一個 可變對象,這個可變對象不會被復制。
d = {'a': {'name': '豬八戒'}, 'b': 2, 'c': 3}
d2 = d.copy()
d2['a']['name'] = '孫悟空'
d2['b'] = 11
print('d =', d, id(d))
print('d2 = ', d2, id(d2))

上面, dd2 是相互對立的,但鍵值對 'a': {'name': '豬八戒'} 的值是一個可變對象,d2['a']['name'] = '孫悟空' 會使得 dd2都發(fā)生改變??梢岳斫鉃?,字典 dd2 的鍵值對的值只是保存了變量的地址。

遍歷字典

字典的遍歷,有多種方法,可以使用 keys() 方法,獲取 鍵值對

d = {'a': {'name': '豬八戒'}, 'b': 2, 'c': 3}
for k in d.keys():
    print(k, d[k])

上面,打印結果如下:

name 沙和尚
b 2
c 3

也可以通過 value() 方法,但這樣只獲取到

d = {'name': '沙和尚', 'b': 2, 'c': 3}
for v in d.values():
    print(v)

上面,打印結果如下:

沙和尚
2
3

還可以使用 items() 方法,它會返回序列,序列中包含有 雙值子序列

d = {'name': '沙和尚', 'b': 2, 'c': 3}
print(d.items())
for k, v in d.items():
    print(k, '=', v)

打印結果如下:

dict_items([('name', '沙和尚'), ('b', 2), ('c', 3)])
name = 沙和尚
b = 2
c = 3
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 轉載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,473評論 1 5
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • ?6M14D? ??胡蘿卜米糊 ??胡蘿卜切丁,加幾滴核桃油入炒鍋略炒 ??入輔食機蒸15分鐘 ??蒸好倒入攪拌機加...
    susie268閱讀 258評論 0 0
  • 關于青春里的小愛情,是你我共同的記憶。好似年少無知,又似命中注定。 海子說:“什么季節(jié),你最惆悵,放下了忙亂的籮筐...
    蝸小懶的小公舉閱讀 469評論 0 1
  • 蹦吧,一切煩惱就清空了 攀吧,一切思緒就清零了 跳吧,一切事物就歸零了 跑吧,一切關系就破碎了
    艾塔小饅頭閱讀 239評論 1 0

友情鏈接更多精彩內容