5擒抛、元組推汽、字典

Lesson_5


【1】元組(牢籠中的的列表)

元組 tuple

我們這里說的元組不是那個赫赫有名的元組零食、元組蛋糕歧沪。

能力越大的人都有可能濫用權(quán)力歹撒,反而導(dǎo)致自身萬劫不復(fù)。

同樣诊胞,因為列表過于強大暖夭,python的作者發(fā)明了它的表親---元組。

元組和列表的最大區(qū)別就是,元組里面的數(shù)據(jù)是不可動的迈着。

訪問和創(chuàng)建一個元組

元組和列表竭望,除了不可變這個特征意外,那就是list用的中括號裕菠,tuple用的是小括號


tuple1 = ()

tuple2 = (1,) #只有一個元素的時候一定要在結(jié)尾加上一個逗號咬清,不加上逗號就是number

tuple3 = (1,2,3)

print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))
print('tuple3:',tuple3,type(tuple3))

#tuple1: () <class 'tuple'>
#tuple2: (1,) <class 'tuple'>
#tuple3: (1, 2, 3) <class 'tuple'>

另類定義:


tuple1 = 1,  #number加上逗號就是tuple,不加就是數(shù)字

tuple2 = 1,2,3


print('tuple1:',tuple1,type(tuple1))
print('tuple2:',tuple2,type(tuple2))

#tuple1: (1,) <class 'tuple'>
#tuple2: (1, 2, 3) <class 'tuple'>

我們嘗試一下不帶逗號會怎么樣:

tuple1 = (1)

tuple2 = (1,)

print(tuple1 * 3)
print(tuple2 * 3)

#3
#(1, 1, 1)

訪問tuple的索引和list是一樣的:

tuple1 = ((1,2,3),4,(5,6,7),[1,2,3])
#二維的元組糕韧,可以嵌套多類型的數(shù)據(jù)

print(tuple1[0][0])
print(tuple1[1])
print(tuple1[3][2])

#1
#4
#3

tuple也是可以切片的:

tuple1 = 1,2,3,4,5,6,7,8,9

print(tuple1[:5])  #從0開始取列表中錢5個元素
print(tuple1[-1])  #查找最后一個元素
print(tuple1[::2]) #隔2個查一次
print(tuple1[::-1]) #返回翻轉(zhuǎn)的結(jié)果

#(1, 2, 3, 4, 5)
#9
#(1, 3, 5, 7, 9)
#(9, 8, 7, 6, 5, 4, 3, 2, 1)

tuple的元素是不可變的:

修改:


tuple1 = 1,2,3,4,5,6,7,8,9

tuple1[0] = 0

print(tuple1)

#TypeError: 'tuple' object does not support item assignment

刪除:


tuple1 = 1,2,3,4,5,6,7,8,9

del tuple1[-1]

print(tuple1)

#TypeError: 'tuple' object does not support item assignment

更新和刪除元組

修改

前面說過了枫振,元組的元素具有不可變性,那么有沒有其它辦法了萤彩?

我們可以通過合并的方式向元組的尾部或者頭部插入數(shù)據(jù)


tuple1 = '成龍','李連杰','李小龍'

name1 = '梁小龍',  

name2 = '元彪','洪金寶'

tuple1 = tuple1 + name1 #通過拼接在重新賦值給 tuple1

tuple1 = name2 + tuple1

print(tuple1)


#('元彪', '洪金寶', '成龍', '李連杰', '李小龍', '梁小龍')

#注意:拼接只能是同類型之間拼接

得到結(jié)論粪滤,元組要修改就必須要重新賦值。

刪除元組

刪除元組的元素我們在上面的內(nèi)容已經(jīng)嘗試過了雀扶,是不可實現(xiàn)的杖小。

元組的刪除和修改差不多,要刪就全刪愚墓。


tuple1 = '成龍','李連杰','李小龍'

del tuple1

返回指定值得下標(biāo)


tuple1 = '成龍','李連杰','李小龍'


print(tuple1.index('成龍'))

#0

返回元組的個數(shù)


tuple1 = '成龍','李連杰','李小龍'

print(len(tuple1))

#3

返回元組中的最大值和最小值


tuple1 = 1,2,3,4,5,6,7


print(max(tuple1))
print(min(tuple1))

#7
#1

返回數(shù)組的和


tuple1 = 1,2,3,4,5,6,7

tuple1 = 1,2,3,4,5,6,7

print(sum(tuple1))


#28

將元組轉(zhuǎn)成列表


tuple1 = 1,2,3,4,5,6,7

print(list(tuple1))

#[1, 2, 3, 4, 5, 6, 7]

將其它類型轉(zhuǎn)成tuple


list1 = [1,2,3,4,5,6,7]

string = '123344'

print(tuple(list1))
print(tuple(string))

#(1, 2, 3, 4, 5, 6, 7)
#('1', '2', '3', '3', '4', '4')

#number 和 bool 類型的值是不可迭代的予权,所以不能轉(zhuǎn)換

元組的遍歷


tuple1 = [1,2,3,4,5,6,7]

for i in tuple1:
    print(i)

【2】string補充

字符串我們在前面的內(nèi)容里面已經(jīng)學(xué)過不少了,想必大家消化的差不多了浪册,
我們今天再來一波新的用法扫腺。

splitlines([keepends]) 多行分割

默認(rèn)keepends = false的,表示不保留換行符

str40 = '''sunck is a good man!
sunck is a nice man!
sunck is handsome man!
'''
print(str40.splitlines(True))

#['sunck is a good man!\n', 'sunck is a nice man!\n', 'sunck is handsome man!\n']

max()村象、min()

max()笆环、min()可以判斷字符串大小值


str1 = "abcdefg!"
print(max(str1))
print(min(str1))

#g
#!

<image src='images/timg.jpeg'/>

創(chuàng)建字符映射的轉(zhuǎn)換表

str.maketrans(intab, outtab) 方法用于創(chuàng)建字符映射的轉(zhuǎn)換表,對于接受兩個參數(shù)的最簡單的調(diào)用方式厚者,第一個參數(shù)是字符串躁劣,表示需要轉(zhuǎn)換的字符,第二個參數(shù)也是字符串表示轉(zhuǎn)換的目標(biāo)库菲。

str1 = str.maketrans("ac", "65")

print(str1)

#{97: 54, 99: 53}

過濾字符映射

translate() 方法根據(jù)參數(shù)table給出的表(包含 256 個字符)轉(zhuǎn)換字符串的字符,要過濾掉的字符放到 deletechars 參數(shù)中账忘。

str.translate(table, deletechars)

table -- 翻譯表,翻譯表是通過 maketrans() 方法轉(zhuǎn)換而來熙宇。
deletechars -- 字符串中要過濾的字符列表鳖擒。

例如:


intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)  # 制作翻譯表

str = "this is string example....wow!!!"
print(str.translate(trantab))

#th3s 3s str3ng 2x1mpl2....w4w!!!

編碼

encode() 方法以 encoding 指定的編碼格式編碼字符串。errors參數(shù)可以指定不同的錯誤處理方案奇颠。

encoding -- 要使用的編碼败去,如"UTF-8"。

errors -- 設(shè)置不同錯誤的處理方案烈拒。默認(rèn)為 'strict',意為編碼錯誤引起一個UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通過 codecs.register_error() 注冊的任何值。

看個例子:


str1 = "這是一個字符串"
#ignore忽略錯誤
data2 = str1.encode("utf-8", "ignore")
print(data2)
print(type(data2))

#解碼  注意:要與編碼時的編碼格式一致
str3 = data2.decode("gbk", "ignore")
print(str3)


#b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
#<class 'bytes'>
#榪欐槸涓涓瀛楃︿覆

字符判斷

isalpha()

如果字符串中至少有一個字符且所有的字符都是字母返回True,否則返回False

str1 = "abcde"
print(str1.isalpha())

>>>True
isalnum()

如果字符串中至少有一個字符且所有的字符都是字母或數(shù)字返回True,否則返回False


str1 = "1a2b3"
print(str1.isalnum())

>>>True
isspace()

如果字符中只包含空格則返回True,否則返回False


print(" ".isspace())
print("      ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())

【3】字典(dict)

我們在翻開《新華字典》的時候想查一個字的時候荆几,比如“萬“吓妆,我們不會從‘a(chǎn)’到‘z’開始逐個查找,而是直接從‘w’開始吨铸,接著找wan這個發(fā)音行拢,最終找個”萬“字。

python中的字典類型會把‘wan’看著是 鍵(key),”萬“字看著是值(value)诞吱,另外python中的 dict在有些地方稱為哈希(hash)舟奠,有些地方稱為 關(guān)系數(shù)組,也和javascript 的輕量數(shù)據(jù)交換格式(json)是一樣的房维。

用鍵-值(key-value)存儲沼瘫,具有極快的查找速度

<font color='red'>注意:字典是映射關(guān)系,字典不能被切片</font>

key的特性:

1、字典中的key必須唯一
2咙俩、key必須是不可變對象
3耿戚、字符串、整數(shù)等都是不可變的阿趁,可以作為key
4膜蛔、list是可變的,不能作為key
字典是Python語言中唯一的映射類型脖阵。
映射類型對象里哈希值(鍵皂股,key)和指向的對象(值,value)是一對多的的關(guān)系命黔,通常被認(rèn)為是可變的哈希表呜呐。
字典對象是可變的,它是一個容器類型纷铣,能存儲任意個數(shù)的Python對象卵史,其中也可包括其他容器類型。
字典類型與序列類型的區(qū)別:
1.存取和訪問數(shù)據(jù)的方式不同搜立。
2.序列類型只用數(shù)字類型的鍵(從序列的開始按數(shù)值順序索引)以躯;
3.映射類型可以用其他對象類型作鍵(如:數(shù)字、字符串啄踊、元組忧设,一般用字符串作鍵),和序列類型的鍵不同颠通,映射類型的鍵直接或間接地和存儲數(shù)據(jù)值相關(guān)聯(lián)址晕。
4.映射類型中的數(shù)據(jù)是無序排列的。這和序列類型是不一樣的顿锰,序列類型是以數(shù)值序排列的谨垃。
5.映射類型用鍵直接“映射”到值启搂。
字典是Python中最強大的數(shù)據(jù)類型之一。

創(chuàng)建和訪問dict

創(chuàng)建dict

字典在創(chuàng)建的時候必須是{'key':'value'}


dict1 = {}
dict2 = {'name':'tom','sex':'male','age':25}
dict3 = dict()
print(dict1,type(dict1))
print(dict2,type(dict2))
print(dict3,type(dict3))

#{} <class 'dict'>
#{'name': 'tom', 'sex': 'male', 'age': 25} <class 'dict'>
#{} <class 'dict'>
訪問dict

訪問dict必須要指定它的key


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1['name'])

#tom
添加一個新的值

dict1 = {'name':'tom','sex':'male','age':25}
dict1['height'] = '175cm'
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': 25, 'height': '175cm'}

修改指定的值

dict1 = {'name':'tom','sex':'male','age':25}
dict1['age'] = '30'
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': '30'}
刪除指定的值

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1.copy()

dict3 = dict1.copy()

del dict1['age']        #直接刪除

print(dict2.pop('sex')) #彈出一個指定的鍵刘陶,并返回被彈出的值

print(dict3.popitem())  #彈出最后一項胳赌,并返回被彈出的值

print(dict1)
print(dict2)
print(dict3)

#male
#('age', 25)
#{'name': 'tom', 'sex': 'male'}
#{'name': 'tom', 'age': 25}
#{'name': 'tom', 'sex': 'male'}
深度拷貝dict

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1.copy()  

dict3 = dict1

dict1.pop('age')

print(id(dict1),dict1)
print(id(dict2),dict2)
print(id(dict3),dict3)

#4303185888 {'name': 'tom', 'sex': 'male'}
#4303185960 {'name': 'tom', 'sex': 'male', 'age': 25}
#4303185888 {'name': 'tom', 'sex': 'male'}
清除dict

dict.clear()

不管是list還是dict,清除都建議使用clear(),為什么了匙隔?舉個例子

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1

dict1 = {}

print(id(dict1),id(dict2))
print(dict1,dict2)

#4301088808 4301088736
#{} {'name': 'tom', 'sex': 'male', 'age': 25}

上面的例子中 dict1 = {} 并沒有把內(nèi)存中的值給去除疑苫, 而是從新定義了一個 空dict,把指針指向了另一個地址.

dict2是淺拷貝dict1的纷责,那么原來的值還在內(nèi)存中捍掺。這樣做的弊端就是浪費內(nèi)存的使用空間。

使用clear()試一下

dict1 = {'name':'tom','sex':'male','age':25}

dict2 = dict1

print(id(dict1),id(dict2))  #這是清理之前的內(nèi)存地址

dict1.clear()

print(id(dict1),id(dict2))

print(dict1,dict2)


#4301088736 4301088736
##4301088736 4301088736
{} {}

使用clear()以后兩個被一起清理了再膳,而且是在原內(nèi)存空間上做清理的挺勿。

所以不論是list、dict都建議使用.clear()

修改dict

dict1 = {'name':'tom','sex':'male','age':25}

dict1['age'] = 26

dict1.update(sex = 'female')

dict1['cname'] = '湯姆'       #指定key可以修改也可以添加

dict1.update(height = '170')  #height并不存在

print(dict1)

#{'name': 'tom', 'sex': 'female', 'age': 26, 'cname': '湯姆', 'height': '170'}

上面的例子我們能看出來.update()和指定key的效果是一樣的饵史,如果指定的 鍵值對 已經(jīng)存在 則修改满钟,不存在 則添加

<font color='red'>注意:update(key = ‘value’)中key是不帶引號的,而value是帶引號的胳喷,除非它是整數(shù)</font>

寬松訪問

get()方法提供了更加合適的訪問方式湃番。


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1.get('age'))

print(dict1.get('height'))

print(dict1.get('height','not find'))

#25            找到對應(yīng)的key則返回value
#None          沒有找到key返回None
#not find      如果設(shè)置第二個參數(shù),找到key返回對應(yīng)的value吭露,沒有找到返回設(shè)定的默認(rèn)值

相同的吠撮,可以用 in 和 not in 判斷是否在dict里面,但是只能用key作為查找條件

dict1 = {'name':'tom','sex':'male','age':25}

print('name' in dict1)

#True
其它方式創(chuàng)建dict

fromkeys()用于創(chuàng)建一個新的字典讲竿,它有兩個參數(shù)泥兰,第一個參數(shù)是字典的 鍵 ,第二個參數(shù)是可選的题禀,是傳入鍵的對應(yīng)值鞋诗,第二個參數(shù)不寫的話,值默認(rèn)是None迈嘹。

<font color='red'>注意:第一個參數(shù)必須是可迭代的序列削彬,在我們python中可迭代的序列中有三種,str秀仲,list融痛,tuple。而且它是返回一個新的字典神僵,并不會改變原來的值</font>


dict1 = {}
print(dict1.fromkeys('12','str'))
print(dict1.fromkeys([2,3],(1,2,3)))
print(dict1.fromkeys((5,6)))

#{'1': 'str', '2': 'str'}
#{2: (1, 2, 3), 3: (1, 2, 3)}
#{5: None, 6: None}

上面的例子告訴我們做事不能想當(dāng)然雁刷,在第二個print()中并不會將(1,2,3)拆開霎匈,而是將他們當(dāng)著一個值泡一。

keys(),values(),items()

訪問字典的方法還有keys(),values(),items()

keys()是返回字典中的所有鍵诵竭,values()是返回字典中的值到旦,那么items()就是返回字典中的鍵值對亮曹。items()返回的是一個list严沥,每個元素都是tuple焕盟。


dict1 = {'name':'tom','sex':'male','age':25}

print(dict1.keys())
print(dict1.values())
print(dict1.items())

#dict_keys(['name', 'sex', 'age'])
#dict_values(['tom', 'male', 25])
#dict_items([('name', 'tom'), ('sex', 'male'), ('age', 25)])

課堂小作業(yè):

list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]

我們將list轉(zhuǎn)換成dict夜畴,不使用dict()铝阐。


list1 = [('name', 'tom'), ('sex', 'male'), ('age', 25)]

dict1 = {}

for each in list1:
    dict1[each[0]] = each[1]
print(dict1)

#{'name': 'tom', 'sex': 'male', 'age': 25}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末址貌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徘键,更是在濱河造成了極大的恐慌练对,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹害,死亡現(xiàn)場離奇詭異螟凭,居然都是意外死亡,警方通過查閱死者的電腦和手機它呀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門螺男,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纵穿,你說我怎么就攤上這事下隧。” “怎么了谓媒?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵淆院,是天一觀的道長。 經(jīng)常有香客問我句惯,道長土辩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任抢野,我火速辦了婚禮拷淘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘指孤。我一直安慰自己启涯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布邓厕。 她就那樣靜靜地躺著逝嚎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪详恼。 梳的紋絲不亂的頭發(fā)上补君,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音昧互,去河邊找鬼挽铁。 笑死伟桅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叽掘。 我是一名探鬼主播楣铁,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼更扁!你這毒婦竟也來了盖腕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤浓镜,失蹤者是張志新(化名)和其女友劉穎溃列,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膛薛,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡听隐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哄啄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雅任。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咨跌,靈堂內(nèi)的尸體忽然破棺而出沪么,到底是詐尸還是另有隱情,我是刑警寧澤虑润,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布成玫,位于F島的核電站,受9級特大地震影響拳喻,放射性物質(zhì)發(fā)生泄漏哭当。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一冗澈、第九天 我趴在偏房一處隱蔽的房頂上張望钦勘。 院中可真熱鬧,春花似錦亚亲、人聲如沸彻采。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛响。三九已至,卻和暖如春惜索,著一層夾襖步出監(jiān)牢的瞬間特笋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工巾兆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猎物,地道東北人虎囚。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蔫磨,于是被迫代替她去往敵國和親淘讥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一堤如、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù)蒲列,當(dāng)然包括負(fù)整數(shù),在Python程序...
    績重KF閱讀 1,696評論 0 1
  • 本節(jié)要介紹的是Python里面常用的幾種數(shù)據(jù)結(jié)構(gòu)洛退。通常情況下,聲明一個變量只保存一個值是遠(yuǎn)遠(yuǎn)不夠的杰标,我們需要將一組...
    小黑y99閱讀 65,193評論 0 9
  • 考試周到了兵怯,總是有一股子焦慮在里頭。 有句話說的真對啊腔剂,專業(yè)選的好媒区,年年期末像高考。這個期末也是如此掸犬。有了前兩...
    lemonade_閱讀 891評論 7 5
  • 昨天把自認(rèn)為寫的比較流暢的一篇文“外婆”請報大人點評了袜漩,報大人的點評中肯定的話語居多,在最后點出了問題湾碎,建議標(biāo)題由...
    自欺欺人君閱讀 294評論 2 2
  • 因為外國小說里的人物名字太長,太難記柔滔,所以很少讀溢陪,這兩天讀了前段時間買的十本簡版名著之一――法國著名作家雨果的《巴...
    Yu真實同行閱讀 1,680評論 0 1