字典是python重要的組合數據類型。字典的操作比列表更復雜,但二者有相似之處,我建議學習字典可以類比列表的某些操作
1.基本概念
- 字典是無序的對象集合,使用鍵-值(key-value)存儲,具有極快的查找速度
- 鍵(key)必須使用不可變類型
- 同一個字典中,鍵(key)必須是唯一的
2.常用方法
方法 | 描述 |
---|---|
keys() | 返回字典中鍵的列表 |
values () | 返回字典中值的列表 |
items() | 返回元組的列表。每個元組由字典的鍵和相應值組成 |
clear() | 刪除字典的所有條目。 |
copy () | 返回字典高層結構的一個拷貝,但不復制嵌入結構,而只複製對那些結構的引用。 |
update (x) | 用字典x中的鍵值對更新字典內容。 |
get (x[, y]) | 返回鍵x,若未找到該鍵返回none,若提供y,則未找到x時返回 |
3.創建字典
(1)dict函數(通過映射)
>>> #創建字典:dict函數(通過映射)
>>> items=[('name','Gumby'),('age',42)]
>>> d=dict(items)
>>> d
{'name': 'Gumby', 'age': 42}
>>> #dict函數也可以通過關鍵字參數來創建字典
>>> d=dict(name='Mike',age=20)
>>> d
{'name': 'Mike', 'age': 20}
(2)直接賦值
>>> d['Mary']=10
{'name': 'Mike', 'age': 20, 'Mary': 10}
(3)使用for循環
>>> squares={x:x**2 for x in range(1,10)}
>>> squares
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
(4)由列表來創建字典
>>> l1=['a','b','c']
>>> l2=[1,2,3]
>>> d=dict(list(zip(l1,l2))) #向dict()傳入一個元組列表 [(,),(,)]
>>> d
{'a': 1, 'b': 2, 'c': 3}
4.字典元素訪問
>>> d=dict(name='Alice',age=18,sex='F')
>>> d.get('age')
18
>>> d.get('address','無')
'無'
>>> list(d)
['name', 'age', 'sex']
>>> list(d.values())
['Alice', 18, 'F']
>>> list(d.keys())
['name', 'age', 'sex']
>>> list(d.items())
[('name', 'Alice'), ('age', 18), ('sex', 'F')]
>>> for key,value in d.items():
print(key,value,sep='\t')
name Alice
age 18
sex F
5.字典的修改、添加與刪除
(1)修改與添加 update()
#dict.update(dict) 如果兩個字典中存在相同的“鍵”,則以另一個字典中的“值”爲準來更新
>>> sock={'IP':'127.0.0.1','port':80}
>>> sock.update({'IP':'192.168.9.62','protocol':'TCP'})
>>> sock
{'IP': '192.168.9.62', 'port': 80, 'protocol': 'TCP'}
#與update相似的操作**
>>>x = {'a': 1, 'b': 2}
>>>y = {'b': 3, 'c': 4}
>>>z = {**x, **y}
{'a': 1, 'b': 3, 'c': 4}
(2)與update()類似的**操作
>>>x = {'a': 1, 'b': 2}
>>>y = {'b': 3, 'c': 4}
>>>z = {**x, **y}
{'a': 1, 'b': 3, 'c': 4}
(3)刪除
>>> sock={'IP': '192.168.9.62', 'port': 80, 'protocol': 'TCP'}
>>> print(sock.pop('IP'))
192.168.9.62
>>> sock
{'port': 80, 'protocol': 'TCP'}
>>> print(sock.popitem())
('protocol', 'TCP')
>>> sock
{'port': 80}
>>> del sock['port']
>>> sock
{}
6. get()與實例分析
get (x[, y])
返回鍵x,若未找到該鍵返回none,若提供y,則未找到x時返回y,即y爲缺省值
>>> examples = {
1: 'A',
2: 'B',
3: 'c',
}
>>> def func(number):
return examples.get(number, 'None')
>>> func(1)
'A'
>>> func(2)
'B'
>>> func(0)
'None
已知爬蟲已經爬取到2019年中排名前20的大學,並存儲uinfo列表中,如下
>>>uinfo
[['1', '清華大學', '北京'],
['2', '北京大學', '北京'],
['3', '浙江大學', '浙江'],
['4', '上海交通大學', '上海'],
['5', '復旦大學', '上海'],
['6', '中國科學技術大學', '安徽'],
['7', '華中科技大學', '湖北'],
['7', '南京大學', '江蘇'],
['9', '中山大學', '廣東'],
['10', '哈爾濱工業大學', '黑龍江'],
['11', '北京航空航天大學', '北京'],
['12', '武漢大學', '湖北'],
['13', '同濟大學', '上海'],
['14', '西安交通大學', '陝西'],
['15', '四川大學', '四川'],
['16', '北京理工大學', '北京'],
['17', '東南大學', '江蘇'],
['18', '南開大學', '天津'],
['19', '天津大學', '天津'],
['20', '華南理工大學', '廣東']]
現在想統計前20大學的地區分佈情況,並用字典存儲,用get()函數就很容易做到
>>>count_dic={}
>>>for i in uinfo:
if count_dic.get(i[2]): #如果字典中不存在,返回None
count_dic[i[2]]+=1
else:
count_dic[i[2]]=1
>>>count_dic
{'北京': 4,
'浙江': 1,
'上海': 3,
'安徽': 1,
'湖北': 2,
'江蘇': 2,
'廣東': 2,
'黑龍江': 1,
'陝西': 1,
'四川': 1,
'天津': 2}
用字典處理後,就方便對其進行排序
>>>rank=sorted(count_dic.items(),key=lambda x:x[1],reverse=True)
>>>rank
[('北京', 4),
('上海', 3),
('湖北', 2),
('江蘇', 2),
('廣東', 2),
('天津', 2),
('浙江', 1),
('安徽', 1),
('黑龍江', 1),
('陝西', 1),
('四川', 1)]