一文帶你手撕Python之散列類型
1.字典
思考:如果有多個(gè)數(shù)據(jù),例如:“凱子”,“男”,19,如何快速存儲(chǔ)這些數(shù)據(jù)
多數(shù)我們是通過(guò)列表進(jìn)行存儲(chǔ)的
li=['凱子','男',19]
在定義完這個(gè)列表之后我們?nèi)绾蝸?lái)找到數(shù)據(jù)'凱子'呢?
我們可以通過(guò)索引
print(li[0])
如果將來(lái)數(shù)據(jù)順序發(fā)生改變的話,還能用索引值進(jìn)行訪問(wèn)嗎
答案是不能的
數(shù)據(jù)順序發(fā)生變化,每個(gè)數(shù)據(jù)的下標(biāo)也隨之變化,如何保證數(shù)據(jù)順序變化前后能使用同一種方法查找數(shù)據(jù)呢?
那么這里就涉及到了字典
字典的定義
定義:{‘鍵’:'值',‘鍵’:'值'}
1.字典的數(shù)據(jù),都是以鍵值對(duì)的方式----鍵和值都要成對(duì)出現(xiàn)
2.鍵值對(duì)之間用逗號(hào)隔開
字典的定義:
d={'name':'凱子','age':19,'sex':'男'}
print(d)
#{'name': '凱子', 'age': 19, 'sex': '男'}
print(type(d))
#<class 'dict'>
獲取字典內(nèi)值的方式:字典[鍵]
#上面已經(jīng)將字典定義好了,但是我們現(xiàn)在怎么進(jìn)行拿值的操作呢? #獲取值---字典[鍵]: #序列類型是有順序的,散列類型是沒有順序的 #字典也是沒有順序的,如果想訪問(wèn)值的話,我們是需要通過(guò)鍵進(jìn)行獲取的 print(d['name']) #凱子 #我們將順序進(jìn)行改變的話我們?nèi)匀荒苓M(jìn)行訪問(wèn)
序列類型是有順序的,散列類型是沒有順序的
字典也是沒有順序的,如果想訪問(wèn)值的話,我們是需要通過(guò)鍵進(jìn)行獲取的
在字典之內(nèi)不管順序怎么變我們都能通過(guò)鍵進(jìn)行訪問(wèn)
字典注意事項(xiàng)
鍵必須是唯一的
#鍵必須是唯一的
d={'name': '凱子', 'age': 19, 'sex': '男',"name":"小明"}
print(d)
#{'name': '小明', 'age': 19, 'sex': '男'}
#之前定義的凱子就被這個(gè)小明給替換掉了
#如果在字典里面出現(xiàn)重復(fù)的鍵,那么前面的鍵值對(duì)會(huì)被后面的鍵值對(duì)給替換掉
'''
因?yàn)槲覀冎熬驼f(shuō)明了
在字典中對(duì)數(shù)值的訪問(wèn)我們只能通過(guò)鍵
那么現(xiàn)在有兩個(gè)一樣的鍵,那么我們是不知道訪問(wèn)誰(shuí)的
所以在字典中鍵必須是唯一的
如果同時(shí)出現(xiàn)一樣的鍵,那么前面的鍵值對(duì)會(huì)被后面鍵值對(duì)提壞
如果確實(shí)要定義兩個(gè)名字的話,我們可以在name后面加上數(shù)字進(jìn)行區(qū)分
'''
如果在字典里面出現(xiàn)重復(fù)的鍵,那么前面的鍵值對(duì)會(huì)被后面的鍵值對(duì)給替換掉
最好的解決方法就是在鍵后面加上數(shù)字進(jìn)行區(qū)分
鍵值對(duì)必須成對(duì)出現(xiàn),不然就會(huì)報(bào)錯(cuò)
字典中的鍵,只能是不可以修改的類型(字符串、元組、數(shù)字)
所以我們是不能用列表作為鍵
字典的操作方式---增刪改查
1.獲取值---字典[鍵]:獲取對(duì)應(yīng)鍵的值
#獲取小明這個(gè)值 #字典[鍵] print(d['name'])
2.修改值---字典[鍵]=新值
d={'name':'凱子','age':19,'sex':'男'}
d['name']="小紅"
print(d)
#{'name': '小紅', 'age': 19, 'sex': '男'}
3.添加鍵值對(duì)---字典[新鍵]=新值
d['name3']='小蘭'
print(d)
#{'name': '小紅', 'age': 19, 'sex': '男', 'name3': '小蘭'}
字典[鍵]=新值
對(duì)于這個(gè),鍵存在,那么就是對(duì)這個(gè)鍵指向的值進(jìn)行修改
如果不存在的話,就是新添加一個(gè)新的鍵以及這個(gè)鍵指向的新值
4.獲取字典中的值的方式
1.1字典[鍵]:獲取對(duì)應(yīng)鍵的值
1.2字典.get(鍵,鍵不存在的提示)
print(d.get('name'))
#小紅
print(d.get('age'))
#19
print(d.get('age1'))
#None
'''
這種方式就會(huì)進(jìn)行一個(gè)提示,如果我們輸入的鍵是不存在的話
那么就會(huì)提示我們None,說(shuō)明字典里面并沒有這個(gè)鍵
'''
#除此之外,我們是可以自己設(shè)置這個(gè)提示,提醒我們這個(gè)鍵不存在
print(d.get('age1','鍵不存在'))
#鍵不存在
我們可以在這個(gè)get函數(shù)進(jìn)行鍵對(duì)應(yīng)值的查找,并且我們還能判斷鍵是否存在
可以對(duì)鍵不存在的信息進(jìn)行設(shè)置
5.setdefault(鍵,值)---鍵存在,返回對(duì)應(yīng)的值
鍵不存在就會(huì)將鍵值對(duì)進(jìn)行添加
d={'name':'凱子','age':19,'sex':'男'}
print(d.setdefault('name5','kk'))
print(d)
#{'name': '凱子', 'age': 19, 'sex': '男', 'name5': 'kk'}
#這里的name5就是不存在的鍵
#通過(guò)這種方法我們直接將這個(gè)鍵放到字典中
print(d.setdefault('name5','55'))
print(d)
#{'name': '凱子', 'age': 19, 'sex': '男', 'name5': 'kk'}
#r如果我們輸入的鍵是存在的話,那么我們就不進(jìn)行額外的操作了
如果我們輸入的鍵是存在的話,那么我們就不進(jìn)行額外的操作了
如果我們輸入的鍵是不存在的話,那么我們就在這個(gè)字典中添加這個(gè)鍵以及這個(gè)鍵對(duì)應(yīng)的值
但是如果存在的話,我們是不進(jìn)行額外的操作的
我們僅僅只需要進(jìn)行鍵對(duì)應(yīng)的值的打印
setdefault返回的一般是鍵對(duì)應(yīng)的值
字典.setdefault(鍵,’數(shù)據(jù)‘)
小回顧:
#當(dāng)前字典里面有三對(duì)鍵值對(duì)
#鍵和值之間的分割符是冒號(hào)
#鍵值對(duì)之間的分隔符是逗號(hào)
#用花括號(hào)將所有的鍵值對(duì)進(jìn)行包裹
d={'name':"小明",'age':18,'sex':'男'}
#獲取小明這個(gè)值
#字典[鍵]
print(d['name'])
#修改值---字典[鍵]=新值
d['name']="小紅"
print(d)
#添加值--字典[新鍵]=新值
d['name1']="小工"
print(d)
#這個(gè)name1這個(gè)鍵是之前沒出現(xiàn)過(guò)的
#所以編譯器會(huì)將這個(gè)鍵和其對(duì)應(yīng)的值會(huì)作為鍵值對(duì)添加到字典中
print(d.get('name'))
#小紅
#如果不存在我們想尋找的鍵值對(duì)的話,那么編譯器會(huì)通過(guò)這個(gè)函數(shù)將這個(gè)鍵值對(duì)添加到字典之中
print(d.setdefault('name5',"kaizi"))
print(d)
print(d.setdefault('name'))
#如果這個(gè)鍵存在的話,那么setdefault就會(huì)返回這個(gè)鍵對(duì)應(yīng)的值6.update()---添加多個(gè)鍵值對(duì)
字典.update(字典)
update添加多個(gè)鍵值對(duì)的使用方法:
#{'name': '小紅', 'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi'}
#在原有的字典中添加鍵值對(duì)
d.update({'name2':"小李",'age2':'15'})
print(d)
'''
{'name': '小紅', 'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi', 'name2': '小李', 'age2': '15'}
'''
#這個(gè)就是在update的括號(hào)內(nèi)添加一個(gè)字典
7.pop(鍵)---刪除指定的鍵值對(duì)
#{'name': '小紅', 'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi'}
#刪除小紅
d.pop('name')
print(d)
'''
{'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi', 'name2': '小李', 'age2': '15'}
'''
#在列表中對(duì)元素進(jìn)行刪除的時(shí)候使用pop我們?cè)诶ㄌ?hào)內(nèi)不輸入元素的索引值
#那么默認(rèn)就是刪除最后一個(gè)元素
#但是現(xiàn)在我們這里的字典的話使用刪除的方法的時(shí)候我們一定要在括號(hào)內(nèi)加上要?jiǎng)h除的鍵值對(duì)的鍵
在列表中對(duì)元素進(jìn)行刪除的時(shí)候使用pop我們?cè)诶ㄌ?hào)內(nèi)不輸入元素的索引值
那么默認(rèn)就是刪除最后一個(gè)元素
但是現(xiàn)在我們這里的字典的話使用刪除的方法的時(shí)候我們一定要在括號(hào)內(nèi)加上要?jiǎng)h除的鍵值對(duì)的鍵
pop的內(nèi)容里面必須要有內(nèi)容,沒有內(nèi)容的話就是會(huì)報(bào)錯(cuò)的
8.poptiem()---刪除最后一個(gè)鍵值對(duì)
d.popitem()
print(d)
#{'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi', 'name2': '小李'}
d.popitem()
print(d)
#{'age': 18, 'sex': '男', 'name1': '小工', 'name5': 'kaizi'}
#返回關(guān)鍵字和值構(gòu)成的元組
print(d.popitem())
#('name5', 'kaizi')
print(d)
#{'age': 18, 'sex': '男', 'name1': '小工'}
print(d.popitem())
#('name1', '小工')
#返回的值就是要?jiǎng)h除的鍵值對(duì)組成的元組
#返回關(guān)鍵字和值構(gòu)成的元組
print(d.popitem())
#('name5', 'kaizi')
print(d)
#{'age': 18, 'sex': '男', 'name1': '小工'}
print(d.popitem())
#('name1', '小工')
#返回的值就是要?jiǎng)h除的鍵值對(duì)組成的元組
9.values()獲取字典中所有的值
字典.values()
d={'name':"小明",'age':18,'sex':'男',"name1":"小紅"}
print(d.values())
#dict_values(['小明', 18, '男', '小紅'])
for i in d.values():
print(i)
'''
小明
18
男
小紅
對(duì)于這個(gè)循環(huán)的寫法,我們編譯器會(huì)先執(zhí)行這個(gè)d.values的方法,
print(d.values())
#dict_values(['小明', 18, '男', '小紅'])
獲取到字典中的值
這些值都被存在一個(gè)列表中
然后我們i遍歷這個(gè)列表打印每一個(gè)值
'''
我們將d.values寫到for循環(huán)的條件中
我們先進(jìn)行d.values的編譯,然后生成了一個(gè)列表,這個(gè)列表里面存著的就是這個(gè)字典里面的數(shù)據(jù)
然后i進(jìn)行這個(gè)列表的遍歷,然后進(jìn)行數(shù)據(jù)的打印
10.keys()---獲取字典中所有的鍵
d={'name':"小明",'age':18,'sex':'男',"name1":"小紅"}
print(d.keys())
#dict_keys(['name', 'age', 'sex', 'name1'])
#同樣,獲取的鍵也會(huì)存在列表中
#那么我們也可以同樣利用for循環(huán)遍歷這個(gè)鏈表進(jìn)行鍵的打印
for i in d.keys():
print(i)
'''
name
age
sex
name1
'''
將獲取的鍵存在列表中,利用for循環(huán)進(jìn)行遍歷列表,打印每一個(gè)鍵
11.items()---獲取字典中所有的鍵值對(duì)
#利用items就能獲取這個(gè)字典內(nèi)的鍵值對(duì),得到的鍵值對(duì)會(huì)被存在列表中
#每一個(gè)鍵值對(duì)在列表中存在的元素是元組形式的
d={'name':"小明",'age':18,'sex':'男',"name1":"小紅"}
print(d.items())
'''
dict_items([('name', '小明'), ('age', 18), ('sex', '男'), ('name1', '小紅')])
'''
#我們從這個(gè)存儲(chǔ)鍵值對(duì)的列表中進(jìn)行遍歷,打印每一個(gè)鍵值對(duì)
for i in d.items():
print(i)
'''
('name', '小明')
('age', 18)
('sex', '男')
('name1', '小紅')
'''
用鍵:值這個(gè)格式將字典內(nèi)的鍵值對(duì)表示出來(lái)
因?yàn)槲覀兪褂胕tems獲取到的鍵值對(duì)是以元組形式存進(jìn)這個(gè)列表的
那么我們隨著i的變化就能進(jìn)行列表中所有鍵值對(duì)的訪問(wèn),也就是對(duì)元組的訪問(wèn)
那么我們是可以通過(guò)索引值訪問(wèn)元組內(nèi)的元素的
這個(gè)元組內(nèi)的元素下標(biāo)為0就是鍵,1就是鍵指向的數(shù)據(jù)
那么我們就可以利用循環(huán)將這個(gè)格式進(jìn)行輸出
利用索引值將鍵值隊(duì)的格式表現(xiàn)出來(lái):
#鍵值對(duì)存在列表中
#對(duì)于這個(gè)循環(huán)來(lái)說(shuō),i存放的數(shù)據(jù)是鍵值對(duì)的數(shù)據(jù),鍵值對(duì)輸出的格式是---鍵:值
#因?yàn)殒I值對(duì)存在列表中,所以我們是可以用下標(biāo)進(jìn)行訪問(wèn)的
d={'name':"小明",'age':18,'sex':'男',"name1":"小紅"}
print(d.items())
#dict_items([('name', '小明'), ('age', 18), ('sex', '男'), ('name1', '小紅')])
for i in d.items():
#print(i)
#通過(guò)索引的方式將鍵和值單獨(dú)的獲取
#鍵值對(duì)在這個(gè)列表中存在的形式是元組
#通過(guò)i的變化,我們?cè)L問(wèn)每一個(gè)鍵值對(duì)
#那么我們就可以用i+索引進(jìn)行元組內(nèi)元素的訪問(wèn)的操作了
print(i[0])#訪問(wèn)的是鍵
print(i[1])#訪問(wèn)的是值
print(f'{i[0]}:{i[1]}')
'''
那么我們通過(guò)循環(huán)就打印出這么個(gè)樣子
name:小明
age:18
sex:男
name1:小紅
和我們預(yù)期的是一樣的
'''
除了使用索引,我們還能使用拆包的方法
回顧一下什么事拆包
元組可以同時(shí)賦值給多個(gè)變量,只要變量個(gè)數(shù)不超過(guò)元組長(zhǎng)度,變量前面加上* 號(hào)則可以將多于元素都接受,并組成一個(gè)列表
d={'name':"小明",'age':18,'sex':'男',"name1":"小紅"}
print(d.items())
#dict_items([('name', '小明'), ('age', 18), ('sex', '男'), ('name1', '小紅')])
for i in d.items():
a,b=i
## print(a)
## print(b)
print(f'{a}:')
'''
隨著i的遍歷,每次都指向著不同的元組,就是指向不同的鍵值對(duì)
那么所以說(shuō)i種存在兩個(gè)值,就是鍵和鍵指向的值
那么我們就利用元組的拆包的操作
將鍵值對(duì)這兩個(gè)值存在我們創(chuàng)建的兩個(gè)變量中
a就是存儲(chǔ)鍵
b就是存儲(chǔ)值了
那么我們利用循環(huán),i遍歷整個(gè)列表我們將整個(gè)列表中的元素都進(jìn)行打印了
'''
#兩種方法都能實(shí)現(xiàn)我們想要的效果
'''
name:小明
age:18
sex:男
name1:小紅
'''
2.集合
集合的概念以及定義(包括空集合)
集合的定義:{元素1,元素2…….}
i={1,5,6}
print(type(i))
#<class 'set'>
那么空集合該怎么進(jìn)行使用呢?
如果我們光寫一個(gè)花括號(hào)的話,那么這個(gè)是不是就能表示空集合呢?
答案是不能的
q={}
print(type(q))
#<class 'dict'>
最后打印出來(lái)的類型是一個(gè)字典
所以說(shuō)一個(gè)空的花括號(hào)表示的是字典
其實(shí)空集合的創(chuàng)建是set()
o=set() print(type(o)) #<class 'set'>
所以set就是集合的表示方式
創(chuàng)建空集合一定要使用set()
集合的特點(diǎn)
1.集合是和字典是一樣的,元素是沒有順序的
所以我們?cè)诖蛴〖系臅r(shí)候打印出來(lái)的數(shù)據(jù)的順序都是隨機(jī)的
2.集合內(nèi)的元素都是唯一的
如果我們?cè)诙x集合元素的時(shí)候有多個(gè)相同的元素的話,那么我們?cè)诖蛴〉臅r(shí)候指只會(huì)保留一個(gè)
j={1,2,3,'hu',5,6,1,5}
print(j)
#{1, 2, 3, 5, 6, 'hu'}
所以集合是無(wú)序不重復(fù)的散列
集合的操作
1.去重:利用集合的特點(diǎn)---元素是唯一的
#對(duì)列表進(jìn)行去重的操作
li=[12,56,89,56,16]
#將列表轉(zhuǎn)換為集合的類型
j2=set(li)
print(j2)
#{56, 89, 12, 16}
#然后將集合轉(zhuǎn)換為列表,然后這個(gè)列表就完成了去重的操作了
li=list(j2)
print(li)
如果一個(gè)列表需要進(jìn)行去重的話,我們就可以將這個(gè)列表轉(zhuǎn)換為集合然后進(jìn)行去重的操作
2.修改
對(duì)于集合的話我們是沒有直接的修改的操作的
我們只能先刪除再添加
3.添加
#### 3.1 add(元素)---添加元素到集合中
我們說(shuō)加什么add就加什么,不會(huì)做額外的操作
#添加操作
j={1,2,3,'hu',5,6,1,5}
j.add("你好啊")
print(j)
#{1, 2, 3, 'hu', 5, 6, '你好啊'}
#### 3.2 upodate(序列/散列)
這個(gè)函數(shù)會(huì)將我們輸入的要添加的序列或者是散列給拆分了
#添加序列的話
#update(序列/散列)
j.update("你好")
print(j)
#{1, 2, 3, 5, 6, 'hu', '你', '好', '你好啊'}
#可以發(fā)現(xiàn)我們后面輸入的被拆開了
#將我們輸入的序列或者是散列類型的數(shù)據(jù)拆開放到集合中
括號(hào)內(nèi)是不能夠?qū)憯?shù)字的,會(huì)報(bào)錯(cuò),因?yàn)槔ㄌ?hào)內(nèi)只能寫序列和散列
4.刪除
#### 4.1remove(指定元素)
我們是需要指定值進(jìn)行操作的
j={1,2,3,'hu',5,6,1,5}
j.remove("hu")
print(j)
#{1, 2, 3, 5, 6}
j.remove(5)
print(j)
#{1, 2, 3, 6}
#### 4.2pop()---刪除隨機(jī)元素
之所以刪除隨機(jī)元素,因?yàn)閿?shù)據(jù)的位置都是隨意變動(dòng)的
#{1, 2, 3, 6}
j.pop()
print(j)
#{2, 3, 6}
5.交集、并集
只有集合里面存在這個(gè)概念
#### 5.1交集----- &
取出兩個(gè)集合中相同的內(nèi)容
a={1,2,3,4}
b={3,4,5,6}
print(a&b)
#{3, 4}
#### 5.2并集----- |
兩個(gè)集合合并在一起
a={1,2,3,4}
b={3,4,5,6}
print(a|b)
#{1, 2, 3, 4, 5, 6}
集合中每個(gè)數(shù)據(jù)都是唯一的
那么出現(xiàn)的兩個(gè)3和兩個(gè)4最后都只保留了一個(gè)
要遵循集合的規(guī)則
至此,我們的數(shù)據(jù)類型就學(xué)完了
運(yùn)算符的優(yōu)先級(jí)

賦值元素符就是左右兩邊的內(nèi)容進(jìn)行指定的算術(shù)運(yùn)算再將結(jié)果賦值給左邊的變量
成員運(yùn)算符
成員運(yùn)算符有兩個(gè):in not in
成員運(yùn)算符在序列和散列居多
主要是判斷某個(gè)內(nèi)容在這一堆是否存在
使用格式:數(shù)據(jù) in 序列/散列
判斷數(shù)據(jù)是不是序列/散列的成員
成員運(yùn)算符的使用
#判斷字符p是不是python的成員
print('p'in'pyhton')
#True
li=['李四''張三''王二']
if "小明" in li:#判斷小明在不在名字列表里面
print(True)
else:
print(False)
#False
#判斷字符q是否不是python的成員
print('q'not in'pyhton')
#not in 的操作就是和in的操作是相反的
身份運(yùn)算符
看的是你引用的是不是同一塊內(nèi)存空間的內(nèi)容
is判斷兩個(gè)內(nèi)容是不是同一個(gè)地址
is not相反
a=1
b=a
c=2
print(a is b)#True
#a和b指定同一塊空間
print(a is c)#False
#a和c不指向同一塊空間
print(f'a:{id(a)}')
print(f'b:{id(b)}')
print(f'c:{id(c)}')
#a:1535758792
#b:1535758792
#c:1535758808
#可見, 我們通過(guò)id()這個(gè)函數(shù)我們就能看的出a和b二檔地址與c是不同的
#is判斷兩個(gè)內(nèi)容是不是同一個(gè)地址
#is not相反
使用id()能查看數(shù)據(jù)的地址
可變復(fù)制---copy()
在進(jìn)行重要數(shù)據(jù)的賦值之前
我們需要對(duì)這個(gè)數(shù)據(jù)進(jìn)行一個(gè)拷貝復(fù)制,因?yàn)檫@個(gè)數(shù)據(jù)一但被修改了就不能回復(fù)了
所以我們需要提前將這個(gè)數(shù)據(jù)進(jìn)行復(fù)制一下
對(duì)于可以修改的數(shù)據(jù)類型,之前的數(shù)據(jù)就沒有了
且不能恢復(fù)
如果想保留修改之前的數(shù)據(jù)
我們需要提前備份一份數(shù)據(jù)
我們需要使用到copy()函數(shù)
copy()函數(shù)的使用方式:
li=[1,2,3,4,5] print(id(li))#72456872 li1=li.copy() print(li1) #[1, 2, 3, 4, 5] print(id(li1))#72456840
我們使用copy去備份數(shù)據(jù)的時(shí)候,copy會(huì)去額外申請(qǐng)一個(gè)空間去放這個(gè)備份的數(shù)據(jù)
備份類型直接對(duì)于只能修改的類型
列表、字典、集合
如果我們是想通過(guò)賦值來(lái)達(dá)到備份的效果,這個(gè)是不可能的
因?yàn)槲覀冑x值出來(lái)的對(duì)象與原先的對(duì)象都指向著同一塊空間的
那么我們將原先對(duì)象進(jìn)行改變,那么備份的對(duì)象也會(huì)被改變,因?yàn)槎贾赶蛲粔K空間
所以我們需要copy()來(lái)專門進(jìn)行備份的操作
通過(guò)copy會(huì)額外申請(qǐng)一塊空間
3.回顧
1.數(shù)值類型
整型 int 整數(shù) 不可以修改的
浮點(diǎn)型 float 帶小數(shù)點(diǎn)的數(shù)字 不可以修改的
布爾型 bool True(真1)、False(假0) 不可以修改的
2.序列類型(索引、切片)
字符串 str 用引號(hào)括起來(lái)的內(nèi)容 不可以修改的(存在修改方法,但是會(huì)生成新的字符串)
列表 list [元素1,元素2] 可以修改
元組 tuple (元素1,元素2) 不可以修改的
3.散列類型
字典 dict {鍵:值,鍵:值} 可以修改
集合 set {元素1,元素2} 可以修改
題目
1.用戶登錄
如果用戶名存在就輸入密碼,當(dāng)密碼正確的時(shí)候就顯示登錄成功并且退出程序
如果用戶名不存在則提示用戶注冊(cè)
判斷用戶是否存在
存在---輸入密碼
不存在---提示用戶注冊(cè)
students =[
{'name':'張三','password':123},
{'name':'王五','password':888},
{'name':'趙六','password':456}
]
name=input("請(qǐng)輸入用戶名:")
for i in students:
#i存在的是用戶的信息字典
if name==i['name']:
#對(duì)輸入的用戶名進(jìn)行判斷
for n in range(1,4):
#循環(huán)3次進(jìn)行輸入密碼的操作,如果輸入正確直接跳出循環(huán)
pwd=eval(input("請(qǐng)輸入密碼:"))
if pwd==i['password']:
print('登錄成功')
exit()
#break#只能退出當(dāng)前所在的循環(huán),就是跳出了里面的循環(huán),還是處于外部循環(huán)
else:
print(f'密碼錯(cuò)誤,還剩{3-n}次機(jī)會(huì)')
#if name==i['name'] and pwd==i['password'] :
break
else:#循環(huán)正常結(jié)束執(zhí)行,即沒有break語(yǔ)句
print("用戶名不存在")
#對(duì)于這個(gè)程序的話,我們 不管輸入什么最后都會(huì)打印這個(gè)用戶名不存在
#我們內(nèi)循環(huán)里面的break僅僅只夠我們跳出內(nèi)部循環(huán)
#但是沒有跳出外部循環(huán),這就是為什么會(huì)打印else的那句話
#那么我們就在外部循環(huán)加上一個(gè)判斷語(yǔ)句,如果條件成立就直接跳出
#那么就不會(huì)進(jìn)行這個(gè)循環(huán)后面的代碼了
#總結(jié),就是break只能退出當(dāng)前所在的循環(huán),所以在外邊循環(huán)中我們需要再寫一個(gè)break跳出外部循環(huán)
#對(duì)于后面的這個(gè)else語(yǔ)句來(lái)說(shuō)
#循環(huán)正常結(jié)束執(zhí)行,即沒有break語(yǔ)句
#但是我們?cè)趦?nèi)循環(huán)break的位置加一個(gè)exit()
#我們直接退出這個(gè)程序,那么就沒有后面else的事了
#如果后面有代碼的話,這個(gè)exit()影響到了后面代碼的執(zhí)行的話
#那么我們就使用break來(lái)跳出
#兩個(gè)break
students =[
{'name':'張三','password':123},
{'name':'王五','password':888},
{'name':'趙六','password':456}
]
name=input("請(qǐng)輸入用戶名:")
for i in students:
#print(i)
if name in i.values():
#獲取當(dāng)前字典內(nèi)的值
#我們?cè)谶@里需要用到字典相關(guān)的函數(shù)--values去獲取字典內(nèi)的值
#查看當(dāng)前遍歷到的字典有沒有我們輸入的name
#print("存在")
for n in range(3):
pws=int(input("請(qǐng)輸入密碼:"))
if pws==i['password']:
print("登錄成功")
exit()
else:
print(f"密碼錯(cuò)誤,還剩{3-n}次機(jī)會(huì)")
else:#循環(huán)正常結(jié)束才會(huì)執(zhí)行
print("用戶名不存在")
#在這個(gè)代碼里面只有一個(gè)循環(huán)
#那么我們?cè)赽reak之后我們就不會(huì)觸發(fā)這個(gè)else了,我們直接跳出循環(huán)了
#我們這里的break跳出循環(huán)是非正常循環(huán)的
2.數(shù)字重復(fù)統(tǒng)計(jì):
'''
數(shù)字重復(fù)統(tǒng)計(jì):
(1)隨機(jī)生成1000個(gè)整數(shù)
import.random
random.randint
(2)數(shù)字的范圍[20,100]
(3)升序輸出所有不同的數(shù)字及每個(gè)數(shù)字重復(fù)的次數(shù)
'''
import random
li=[]#創(chuàng)建一個(gè)空列表
for i in range(1000):
num=random.randint(20,100)
print(num)
li.append(num)#我們將每次循環(huán)產(chǎn)生的數(shù)添加到這個(gè)列表中
print(li)
#升序輸出所有不同的數(shù)字---去重(轉(zhuǎn)換為集合),排序(sort)
li1=list(set(li))
#先轉(zhuǎn)換為集合再轉(zhuǎn)換為列表,我們就達(dá)到了去重的效果
print(li1)
li1.sort()#默認(rèn)是從小到大,升序的
print(li1)
#每個(gè)數(shù)字重復(fù)的次數(shù)---統(tǒng)計(jì)數(shù)字出現(xiàn)的次數(shù)(序列.count(數(shù)據(jù)))
for i in li1:#遍歷去重的列表
#進(jìn)行統(tǒng)計(jì),對(duì)沒有機(jī)芯工去重的列表進(jìn)行統(tǒng)計(jì)
x=li.count(i)
print(f'{i}出現(xiàn)了{(lán)x}次')
#我們所有的數(shù)字已經(jīng)在li1里面了,而且沒有重復(fù)的
#那么我們將這個(gè)列表作為外循環(huán)的條件進(jìn)行遍歷
#然后我們?cè)趌i這個(gè)鏈表即興每次遍歷的數(shù)字的出現(xiàn)次數(shù)的計(jì)算
#我們需要將元素存儲(chǔ)起來(lái)
#那么存放多個(gè)元素的有什么呢?
#列表、元組(不可修改)、字典(鍵值對(duì))、集合
#那么最后只有列表和集合方便
#這個(gè)題的要求是還要統(tǒng)計(jì)重復(fù)數(shù)字的次數(shù)而且保存重復(fù)的數(shù)字
#那么我們直接將字典排除了
#因?yàn)樽值涫侨ブ氐?
#那么最后我們就使用列表來(lái)對(duì)這些數(shù)字進(jìn)行存儲(chǔ)
我們?cè)谧詈蠼y(tǒng)計(jì)每個(gè)數(shù)字出現(xiàn)的次數(shù)
我們將每個(gè)數(shù)字進(jìn)行去重
然后針對(duì)每個(gè)數(shù)字進(jìn)行計(jì)數(shù)
通過(guò)這里的代碼就會(huì)縮短時(shí)間
如果我們是對(duì)1000個(gè)數(shù)字一個(gè)一個(gè)進(jìn)行遍歷的話會(huì)很慢的
我們第一步直接將出現(xiàn)的數(shù)字縮水顯現(xiàn)出來(lái)
然后我們?cè)僭谠鹊牧斜碇羞M(jìn)行遍歷計(jì)算這個(gè)數(shù)字出現(xiàn)的次數(shù)
總結(jié)
到此這篇關(guān)于一文帶你手撕Python之散列類型的文章就介紹到這了,更多相關(guān)Python散列類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何使用Plotly和Dash進(jìn)行數(shù)據(jù)可視化
數(shù)據(jù)可視化是數(shù)據(jù)分析中至關(guān)重要的一環(huán),它能夠幫助我們更直觀地理解數(shù)據(jù)并發(fā)現(xiàn)隱藏的模式和趨勢(shì),本文將介紹如何使用Plotly和Dash進(jìn)行數(shù)據(jù)可視化,感興趣的可以了解下2024-04-04
Python+OpenCV六種實(shí)時(shí)圖像處理詳細(xì)講解
OpenCV常用的圖像處理為閾值二值化、邊緣檢測(cè)、輪廓檢測(cè)、高斯濾波、色彩轉(zhuǎn)換、調(diào)節(jié)對(duì)比度。本文主要介紹了利用Python和OpenCV對(duì)實(shí)時(shí)圖像進(jìn)行上述六種操作的詳細(xì)講解,感興趣的可以了解一下。2021-11-11
利用Python腳本實(shí)現(xiàn)自動(dòng)刷網(wǎng)課
這篇文章主要介紹了利用Python腳本實(shí)現(xiàn)自動(dòng)刷網(wǎng)課,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Python實(shí)現(xiàn)的微信公眾號(hào)群發(fā)圖片與文本消息功能實(shí)例詳解
這篇文章主要介紹了Python實(shí)現(xiàn)的微信公眾號(hào)群發(fā)圖片與文本消息功能,結(jié)合實(shí)例形式詳細(xì)分析了Python調(diào)用微信接口實(shí)現(xiàn)微信公眾號(hào)群發(fā)圖片與文本消息的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-06-06
Python itertools.product方法代碼實(shí)例
這篇文章主要介紹了Python itertools.product方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python模擬脈沖星偽信號(hào)頻率實(shí)例代碼
這篇文章主要介紹了Python模擬脈沖星偽信號(hào)頻率實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

