欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你手撕Python之散列類型

 更新時(shí)間:2024年09月18日 09:39:43   作者:2301_80863610  
這篇文章主要介紹了Python字典的定義、操作方法和集合的基本概念,字典以鍵值對(duì)形式存儲(chǔ)數(shù)據(jù),可通過(guò)鍵訪問(wèn)值,操作包括增刪改查等,集合是無(wú)序不重復(fù)的數(shù)據(jù)結(jié)構(gòu),適用于去重和集合運(yùn)算,需要的朋友可以參考下

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ù)可視化

    詳解如何使用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操作Word批量生成文章的方法

    Python操作Word批量生成文章的方法

    這篇文章主要介紹了Python操作Word批量生成文章的方法,需要的朋友可以參考下
    2015-07-07
  • Python集合set()使用的方法詳解

    Python集合set()使用的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python集合set()使用的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Python+OpenCV六種實(shí)時(shí)圖像處理詳細(xì)講解

    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)課

    這篇文章主要介紹了利用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ā)圖片與文本消息功能實(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+OpenCV之直方圖均衡化詳解

    Python+OpenCV之直方圖均衡化詳解

    直方圖均衡化是一種增強(qiáng)圖像對(duì)比度的方法,其主要思想是將一副圖像的直方圖分布變成近似均勻分布,從而增強(qiáng)圖像的對(duì)比度。本文將通過(guò)示例為大家講講直方圖均衡化的原理與實(shí)現(xiàn),感興趣的可以了解一下
    2022-09-09
  • Python itertools.product方法代碼實(shí)例

    Python itertools.product方法代碼實(shí)例

    這篇文章主要介紹了Python itertools.product方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 簡(jiǎn)單介紹Python中的struct模塊

    簡(jiǎn)單介紹Python中的struct模塊

    這篇文章主要介紹了Python中的struct模塊,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python模擬脈沖星偽信號(hào)頻率實(shí)例代碼

    Python模擬脈沖星偽信號(hào)頻率實(shí)例代碼

    這篇文章主要介紹了Python模擬脈沖星偽信號(hào)頻率實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論