python語言基礎五
十一、字典
當我們的資料量很大,查詢一個元素使用索引不好用的時候, 可以利用 字典 (字典以鍵值對的形式儲存, 通過鍵查詢) python 的字典 在很多地方也成為 雜湊。有些地方稱之為關係陣列。 字典是 python 唯一的一個 【對映型別】, 字典不支援下標操作!!!
我使用兩個列表也可以實現這種對映:
brand = ['李寧', '耐克', '光子'] slogan = ['一切皆有可能', 'Just do it ', '用心創造快樂'] print('光子的口號是:', slogan[brand.index('光子')] 輸出 : 光子的口號是: 用心創造快樂
但是這樣看起來繁瑣, 而且容易出錯,效率又低。
而使用字典 :
dict_brand_slogan = {'李寧': '一切皆有可能', '耐克': 'Just do it ', '光子': '用心創造快樂'}
print('光子的口號是:', dict_brand_slogan['光子']) 光子的口號是: 用心創造快樂
字典的用法 :
print(dir(dict)) 輸出 :
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
1. dict() 方法,用於【建立字典】。 將一個對映關係轉換成字典。只接受一個引數(對映型別) print(dict()) {} print(dict(((1, 'xiaoming'), (2, 'xiaohong'), (3, 'xiaolv')))) {1: 'xiaoming', 2: 'xiaohong', 3: 'xiaolv'}
也可以使用【給dict傳遞關鍵字引數】的方式建立字典。關鍵字就是字典的 鍵, 關鍵字對應的值就是字典的值。 【注意】: 這種建立方式下, 關鍵字引數不能是一個常量(比如字串) dict1 = dict(name='xiaoming', age=15, sex='man')
print(dict1) {'name': 'xiaoming', 'age': 15, 'sex': 'man'}
print(type(dict1)) <class 'dict'>
2. 使用工廠函式建立字典。 【工廠函式】: 我們把一些值傳遞給函式, 函式會用這些值產生某種型別的物件作為結果返回。就像 我把一堆塑料放到玩具工廠, 最終會得到一個玩具一樣, 我把一些對映關係傳遞給 dict 這個工廠函式, 他就會給我產生一個 字典。 像 str() 、 int() 、 list() 、 tuple() ... 都屬於工廠函式。
3. fromkeys() 方法,接收兩個引數 , 第一個為可迭代物件,生成字典的 鍵 , 第二個生成字典所有的鍵的值 。如果第二個沒有提供,則用 None 代替。
print(dict.fromkeys((1,2))) {1: None, 2: None}
print(dict.fromkeys((1,2), ('小明', 'xiaohong'))) {1: ('小明', 'xiaohong'), 2: ('小明', 'xiaohong')}
dict1 = dict.fromkeys((1, 2), '棒棒噠')
print(dict1) {1: '棒棒噠', 2: '棒棒噠'} 生成了一個字典
print(dict1.fromkeys((1, ), '不行呀')) {1: '不行呀'} 我想僅僅將字典中某一個鍵的值替換掉, 發現不可以,只能刪除一個新的字典
print(dict1) {1: '棒棒噠', 2: '棒棒噠'} 原來的字典並沒有被修改
dict1['1'] = '好膩害' 我直接提供字典的鍵重新給字典賦值
print(dict1) {1: '棒棒噠', 2: '棒棒噠', '1': '好膩害'} 修改成功
4.keys() 獲取字典中所有的 鍵
dict1 = {'name': 'xiaoming', 'age': 15}
print(dict1.keys()) dict_keys(['name', 'age'])
5. values() 獲取字典中所有的 值
dict1 = {'name': 'xiaoming', 'age': 15}
print(dict1.values()) dict_values(['xiaoming', 15])
6. get(key,defaul=None) 獲取字典中某個鍵對應的值,接收兩個引數, 第二個預設值為 None, 如果在字典中沒有找到 我們要的 key , 就返回第二個引數。
dict1 = {'name': 'xiaoming', 'age': 15}
print(dict1.get('name')) xiaoming
print(dict1.get('sex')) None
print(dict1.get('sex', 'man')) man
判斷一個鍵是否在字典中還可以用 in 和 not in 來進行
dict1 = {'name': 'xiaoming', 'age': 15}
print('name' in dict1) True
print('sex' in dict1) False
7. clear() 清空字典 如下, 我想要清空一個字典, 很容易寫到的辦法就是給這個字典對應的變數重新賦值為一個空字典。 但是, 這樣做只是相當於把貼在舊字典上面的標籤貼到了另外一個地方, 如果我舊的字典還貼了其他的標籤, 那麼訪問其他的標籤得到的還是舊的字典!!! 所以我們應該使用 clear() 這個函式來清空舊的字典, 而不是把標籤貼到新的字典上面去!!!!
dict1 = {'name': 'xiaoming', 'age': 15}
dict2 = dict1 把標籤 dict2 也貼到字典 {'name': 'xiaoming', 'age': 15} 上面
print(dict2) {'name': 'xiaoming', 'age': 15}
dict1 = {} 把 標籤 dict1 貼到別的地方
print(dict1) {} 標籤 dict1 的值變了
print(dict2) {'name': 'xiaoming', 'age': 15} 標籤 dict2 的值還沒變(這就可能引發 BUG )
dict3 = dict2 把標籤 dict3 也貼到字典 {'name': 'xiaoming', 'age': 15} 上面
print(dict3) {'name': 'xiaoming', 'age': 15}
dict2.clear() 呼叫 clear() 方法清空 標籤 dict2 對應的字典
print(dict2) {} 標籤 dict2 的值變了
print(dict3) {} 標籤 dict3 的值也跟著變了
8. copy() 淺拷貝 如下, 使用賦值只是給原變數對應的值多貼了一個標籤, 在記憶體中這兩個標籤指向同一塊記憶體。 而使用 copy() 函式得到的是在記憶體中分配的另外一個值,他有自己獨立的記憶體。
dict1 = {'name': 'xiaoming', 'age': 15}
dict2 = dict1
dict3 = dict1.copy()
print(id(dict1)) 1844290215512 print(id(dict2)) 1844290215512 print(id(dict3)) 1844290215584
9. pop(key) 給定鍵, 彈出對應的【值】。如果給的鍵在字典中不存在, 則會丟擲一個異常 : KeyError: 'sex' pop 可以用來刪除字典中指定的元素, pop 必須指定一個鍵, 否則報 TypeError: pop expected at least 1 arguments, got 0
dict1 = {'name': 'xiaoming', 'age': 15}
print(dict1.pop('name')) xiaoming
print(dict1) {'age': 15}
print(dict1.pop('sex')) KeyError: 'sex'
print(dict1.pop() TypeError: pop expected at least 1 arguments, got 0
10. popitem() 隨機彈出字典中的一個項 【鍵和值都彈出來】
dict1 = {'name': 'xiaoming', 'age': 15, 'sex': 'man'}
print(dict1.popitem()) ('sex', 'man')
print(dict1) {'name': 'xiaoming', 'age': 15}
11. setdefault(key, value=None) 可以用來給字典新增一個新的鍵值對,如果新增的鍵已經存在了, 那麼本次操作無效。 返回新增的鍵對應的值 。 比如, 我要在字典中查詢某個鍵對應的值, 如果沒找到, 我就把這個鍵新增進去,並且給一個預設值。
dict1 = {'name': 'xiaoming', 'age': 15, 'sex': 'man'}
dict1.setdefault('name', 'laowang') 想把 name 設定為 laowang
print(dict1.setdefault('name', 'laowang')) xiaoming 這裡打印出小明, 什麼字典裡面已經有 name 這個鍵
print(dict1.setdefault('dalao', '客氣客氣')) 客氣客氣 這裡列印的是 預設值, 說明原字典沒有這個鍵或者原來這個鍵的值就是 客氣客氣
dict1.setdefault('小白') 這裡沒有給 鍵 設定值, 所以他的值就使用了預設的 None
print(dict1) {'name': 'xiaoming', 'age': 15, 'sex': 'man', 'dalao': '客氣客氣', '小白': None}
12. update() 使用一個新的字典或者一個對映關係去跟新一個字典。如果新的字典或者對映關係裡面的 鍵 在老的字典裡已經存在, 那麼 就用新的值替換老的值, 如果不存在, 那麼就把這個新的鍵值對新增到老的字典裡面。 可以用來一次性給字典新增多個元素
dict1 = {'name': 'xiaoming', 'age': 15, 'sex': 'man'}
dict1.update({'name': 'laowang'})
print(dict1) {'name': 'laowang', 'age': 15, 'sex': 'man'}
dict1.update({'dalao?': 'yes'})
print(dict1) {'name': 'laowang', 'age': 15, 'sex': 'man', 'dalao?': 'yes'}
十二、 集合
集合裡面的每個元素都是唯一的。集合也是無序的,不能去試圖索引集合中的某一個元素。
set1 = {1, 2, 3, 4, 4, 3, 2, 1}
print(set1) {1, 2, 3, 4} 相同的元素只保留了一個
print(type(set1)) <class 'set'>
print(set1[1]) TypeError: 'set' object does not support indexing
集合的用法 :
print(dir(set))
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__',
'__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
1. 建立集合 : 方法一、 直接用一個花括號將右對元素括起來(用逗號隔開) 方法二、使用 set() 這個工廠函式。傳入一個可迭代物件 (比如字典、元組、字串) set() 函式可以用於列表等的去重。 但是 set 創造的集合是無序的!!!
print(set([1, 2, 3, 5, 5])) {1, 2, 3, 5}
print(set('hello')) {'h', 'o', 'l', 'e'}
2. 可以用 in 和 not in 判斷一個元素是否在集合中。
print(5 in set([1, 2, 3, 5, 5, 4])) True print('hello' in set([1, 2, 3, 5, 5, 4])) False
3. add() 方法 : 往集合新增一個元素
set1 = {1, 2, 3, 4, 4, 3, 2, 1}
print(set1) {1, 2, 3, 4} set1.add(10)
print(set1) {1, 2, 3, 4, 10}
4. remove() 方法 : 移除集合中的一個元素(要移除的元素不存在就會報錯 KeyError: 5)
set1.remove(4) print(set1) {1, 2, 3, 10}
----------------------
十三 、 不可變集合 【 frozenset 】
set2 = frozenset([1, 5, 6, 7, 8, 6, 5])
print(set2) frozenset({1, 5, 6, 7, 8})
set2.add('hehe') AttributeError: 'frozenset' object has no attribute 'add'