一。 字典
是一種無序的。可變的序列。他的元素以鍵值對的形式存在。字典中習慣將各元素的索引叫做鍵。鍵所對應的元素叫做值。 將鍵及其值稱之爲鍵值對
- 字典的特徵
通過鍵而不是索引讀取值 | 字典類型有時也稱爲關聯數組或者散列表(hash)。它是通過鍵將一系列的值聯繫起來的,這樣就可以通過鍵從字典中獲取指定項,但不能通過索引來獲取。 |
字典是任意數據類型的無序集合 | 和列表、元組不同,通常會將索引值 0 對應的元素稱爲第一個元素,而字典中的元素是無序的。 |
字典是可變的,並且可以任意嵌套 | 字典可以在原處增長或者縮短(無需生成一個副本),並且它支持任意深度的嵌套,即字典存儲的值也可以是列表或其它的字典。 |
字典中的鍵必須唯一 | 字典中,不支持同一個鍵出現多次,否則只會保留最後一個鍵值對 |
字典中的鍵必須不可變 | 字典中的值是不可變的,只能使用數字、字符串或者元組,不能使用列表。 |
二。創建字典
1。 使用{}創建字典。鍵與值之間必須要用":"隔開。 鍵值對之間必須要用逗號“,”隔開。
a = {
"name": "小張",
"age": 24,
"tall": 178
}
b = {
(1, 2): 24,
20: 20,
"list": [1, 2, 3]
}
print(a)
print("--------")
print(b)
{'name': '小張', 'age': 24, 'tall': 178}
--------
{(1, 2): 24, 20: 20, 'list': [1, 2, 3]}
2。使用fromkeys(()方法創建帶有默認值的字典,該方法必須要有創建鍵的參數。否則會報錯
a = dict.fromkeys(["語文", '數學', '英語'], 80)
print(a)
print("----------")
b = dict.fromkeys(["語文", '數學', '英語'])
print(b)
print("-----------")
c = dict.fromkeys()
print(c)
{'語文': 80, '數學': 80, '英語': 80}
----------
{'語文': None, '數學': None, '英語': None}
-----------
Traceback (most recent call last):
File "/Users/apple/Desktop/python3/python20.py", line 9, in <module>
c = dict.fromkeys()
TypeError: fromkeys expected at least 1 arguments, got 0
3。dict() 映射函數創建字典
a = dict([['q', 1], [2, 3]])
print(a)
print('--------')
b = dict([('q', 1), (2, 3)])
print(b)
print('---------')
c = dict((['q', 1], [2, 3]))
print(c)
print('----------')
d = dict((('q', 1), (2, 3)))
print(d)
{'q': 1, 2: 3}
--------
{'q': 1, 2: 3}
---------
{'q': 1, 2: 3}
----------
{'q': 1, 2: 3}
三。字典的訪問
和列表,元組不同的是字典是通過鍵訪問元素的而不是通過下標訪問的。 因爲字典的是無序的。
a = {
1: 1,
"a": 3,
"b": 5
}
print(a[1])
print("------")
print(a['a'])
print('-------')
print(a[1000])
1
------
3
-------
Traceback (most recent call last):
File "/Users/apple/Desktop/python3/python20.py", line 13, in <module>
print(a[1000])
KeyError: 1000
python還提供了get方法訪問元素,與上述不同的是該方法在訪問不到元素時不會報錯而是返回None
a = {
1: 1,
"a": 3,
"b": 5
}
print(a.get(1))
print('-------')
print(a.get('a'))
print('--------')
print(a.get(10))
1
-------
3
--------
None
四。字典的刪除
和列表。元組一樣字典也可以使用del關鍵字刪除。 因爲有垃圾回收機制的存在一般不會手動去刪除
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
del a
print(a)
{1: 1, 'a': 3, 'b': 5}
Traceback (most recent call last):
File "/Users/apple/Desktop/python3/python20.py", line 9, in <module>
print(a)
NameError: name 'a' is not defined
五。字典添加鍵值對
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
a["語文"] = 1000
a[12] = "添加了數字"
print(a)
{1: 1, 'a': 3, 'b': 5}
--------
{1: 1, 'a': 3, 'b': 5, '語文': 1000, 12: '添加了數字'}
六。字典的修改
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
a[1] = 1000
a['a'] = 'java'
print(a)
{1: 1, 'a': 3, 'b': 5}
--------
{1: 1000, 'a': 'java', 'b': 5}
七 字典刪除鍵值對
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
del a['a']
print(a)
{1: 1, 'a': 3, 'b': 5}
--------
{1: 1, 'b': 5}
八。判斷字典中是否存在元素
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
print('a' in a)
print('-------')
print("a" not in a)
print('-------')
print('100' in a)
print('-------')
print('100' not in a)
{1: 1, 'a': 3, 'b': 5}
--------
True
-------
False
-------
False
-------
True
九。keys()、values() 和 items() 方法
- keys() 方法用於返回字典中的所有鍵(key);
- values() 方法用於返回字典中所有鍵對應的值(value);
- items() 用於返回字典中所有的鍵值對(key-value)
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
print(a.keys())
print('-------')
print(a.values())
print('-------')
print(a.items())
{1: 1, 'a': 3, 'b': 5}
--------
dict_keys([1, 'a', 'b'])
-------
dict_values([1, 3, 5])
-------
dict_items([(1, 1), ('a', 3), ('b', 5)])
爲什麼會出現上述結果。 原因是在python3中不希望用戶直接操作返回值。 一般有以下兩種方法可以使我們使用返回值
1 list() 函數
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
print(list(a.keys()))
print('-------')
print(list(a.values()))
print('-------')
print(list(a.items()))
{1: 1, 'a': 3, 'b': 5}
--------
[1, 'a', 'b']
-------
[1, 3, 5]
-------
[(1, 1), ('a', 3), ('b', 5)]
2。for-in遍歷
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
for key in a.keys():
print(key)
print('-------')
for value in a.values():
print(value)
print('-------')
for k, v in a.items():
print(k, v)
{1: 1, 'a': 3, 'b': 5}
--------
1
a
b
-------
1
3
5
-------
1 1
a 3
b 5
十。copy() 方法 拷貝字典
a = {
1: 1,
"a": 3,
"b": 5
}
print(a)
print('--------')
b = a.copy()
print(a)
{1: 1, 'a': 3, 'b': 5}
--------
{1: 1, 'a': 3, 'b': 5}
注意,copy() 方法所遵循的拷貝原理,既有深拷貝,也有淺拷貝。
a = {
1: 1,
"a": 3,
"b": [1, 2]
}
print(a)
print('--------')
# 向 a 中添加新鍵值對,由於b已經提前將 a 所有鍵值對都深拷貝過來,因此 a 添加新鍵值對,不會影響 b。
b = a.copy()
a[1000] = 10000
print(b)
print(a)
print("----------")
# 由於 b 和 a 共享[1,2,3](淺拷貝),因此移除 a 中列表中的元素,也會影響 b。
a["b"].remove(1)
print(a)
print(b)
{1: 1, 'a': 3, 'b': [1, 2]}
--------
{1: 1, 'a': 3, 'b': [1, 2]}
{1: 1, 'a': 3, 'b': [1, 2], 1000: 10000}
----------
{1: 1, 'a': 3, 'b': [2], 1000: 10000}
{1: 1, 'a': 3, 'b': [2]}
十一。update() 方法
使用一個字典所包含的鍵值對來更新己有的字典,如果被更新的字典中己包含對應的鍵值對,那麼原 value 會被覆蓋;如果被更新的字典中不包含對應的鍵值對,則該鍵值對被添加進去。
a = {
1: 1,
"a": 3,
"b": [1, 2]
}
print(a)
print('--------')
a.update({1: 1000, 2000: 30000})
print(a)
{1: 1, 'a': 3, 'b': [1, 2]}
--------
{1: 1000, 'a': 3, 'b': [1, 2], 2000: 30000}
十二。pop() 和 popitem() 方法
pop() 和 popitem() 都用來刪除字典中的鍵值對,不同的是,pop() 用來刪除指定的鍵值對,而 popitem() 用來隨機刪除一個鍵值對,
= {
1: 1,
"a": 3,
"b": [1, 2]
}
print(a)
print('--------')
a.pop("a")
print(a)
a.popitem()
print(a)
{1: 1, 'a': 3, 'b': [1, 2]}
--------
{1: 1, 'b': [1, 2]}
{1: 1}
說明 popitem() 隨機刪除字典中的一個鍵值對是不準確的,雖然字典是一種無須的列表,但鍵值對在底層也是有存儲順序的,popitem() 總是彈出底層中的最後一個 key-value,這和列表的 pop() 方法類似。
十三 setdefault() 方法
返回某個 key 對應的 value,
a = {
1: 1,
"a": 3,
"b": [1, 2]
}
print(a)
print('--------')
a.setdefault(1000)
print(a)
a.setdefault("語文", 1000)
print(a)
a.setdefault(1, 20000)
print(a)
{1: 1, 'a': 3, 'b': [1, 2]}
--------
{1: 1, 'a': 3, 'b': [1, 2], 1000: None}
{1: 1, 'a': 3, 'b': [1, 2], 1000: None, '語文': 1000}
{1: 1, 'a': 3, 'b': [1, 2], 1000: None, '語文': 1000}
- 如果該 key 存在,那麼直接返回該 key 對應的 value;
- 如果該 key 不存在,那麼先爲該 key 設置默認的 defaultvalue,然後再返回該 key 對應的 defaultvalue。