列表、元組、字典、集合
1. 列表
- 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字- 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。
- Python有6個序列的內置類型,但最常見的是列表和元組。
- 序列都可以進行的操作包括索引,切片,加,乘,檢查成員。
- 此外,Python已經內置確定序列的長度以及確定最大和最小的元素的方法。
- 列表是最常用的Python數據類型,它可以作為一個方括號內的逗號分隔值出現。
- 列表的數據項不需要具有相同的類型
- 創建一個列表,只要把逗號分隔的不同的數據項使用方括號括起來即可。
列表的一般用法:
list1 = ['frui','male',1989,'python',[2016,2017],'c'] #list內元素的數據類型可以不同,也可以是另外一個list list2 = [''] print (list1) #使用下標索引來訪問列表中的值,同樣你也可以使用方括號的形式截取字符,如下所示: print (list1[:]) print (list1[0],list1[1]) print (list1[-1],list1[-2]) print (list1[0:3]) #切片,此操作顧頭不顧尾 print (list1[:3]) print (list1[-3:]) #切片,從后向前數索引,也只能從左往右切片,同樣是顧頭不顧尾。(這樣會無法取到最后一個元素,思考怎么辦?) print (list1[0:-1:2]) #按步長切片 print (list1[::2]) #按步長切片 list1.append("linux") #在列表末尾追加元素 list1.insert(1,"linux") #直接把元素插入的指定位置 list1[0] = "jay" #(改)直接替換某個位置元素 #delete list1.pop() #刪除list末尾的元素 list1.pop(1) #刪除指定位置的元素 del list1[0] list1.remove("python") #此種方法和前兩種的區別是什么? print (list1) print (list1.index(1989)) #查找已知元素的索引 print (list1[list1.index(1989)]) print (list1.count(1989)) #打印某元素在列表中的數量 list1.clear() #清除整個列表 list1.reverse() #反轉整個列表 list1.sort() #排序 按ASCII碼順序排序,若元素中有list類型,則無法排序,為什么? list2 = [1,2,3,4] list1.extend(list2) #列表合並 print (list1) del list2 #刪除整個變量
#列表的深淺copy #淺拷貝只能拷貝最外層,修改內層則原列表和新列表都會變化。 #深拷貝是指將原列表完全克隆一份新的。 import copy list1 = ['frui','male',1989,'python',[2016,2017],'c'] list2 = list1.copy() #淺copy list3 = copy.copy(list1) #淺copy,同list1.copy()效果相同 list4 = copy.deepcopy(list1) #深copy,會和list1占用同樣大小的內存空間 list1[0] = '自由' list1[4][0] = 2015 print (list1,'\n',list2,'\n',list3,'\n',list4)
#列表的循環:逐個打印列表元素 list1 = ['frui','male',1989,'python',[2016,2017],'c'] for i in list1: print (i)
2. 元組
元組也是存一組數據,只是一旦創建,便不能修改,所以又叫只讀列表。元組創建很簡單,只需要在括號中添加元素,並使用逗號隔開即可。
tup1 = (1,2,3,4,5) tup2 = ('frui', 27) tup3 = "a", "b", "c", "d"; tup4 = () #創建空元組
元組中只包含一個元素時,需要在元素后面添加逗號
tuple5 = (50,) #元組中只包含一個元素時,需要在元素后面添加逗號 tuple6 = (50) #如果不加逗號,則定義的不是tuple,是50這個數!這是因為括號()既可以表示tuple,又可以表示數學公式中的小括號,這就產生了歧義,因此,Python規定,這種情況下,按小括號進行計算。
元組只有兩個方法:count和index
不可變的tuple有什么意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
3. 字典
3.1 字典的使用
字典是另一種可變容器模型,且可存儲任意類型對象。
字典的每個鍵值對()用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
鍵必須是唯一的,但值則不必。值可以取任何數據類型,但鍵必須是不可變的,如字符串,數字或元組。
info = { 'stu1':"Xiao Ming", 'stu2':"Xiao Liang", 'stu3':"Xiao Hong", 'stu4':"Xiao Rui", } print (info) #修改 info['stu2'] = "Xiao Hu" #增加 info['stu5'] = "Xiao Fang" #刪除 info.pop('stu2') del info['stu1'] info.popitem() #隨機刪一個 print (info) info.clear() #清空字典所有條目 #查找 print ('stu2' in info) #判斷是否存在,存在則返回True,否則返回False print (info['stu1']) #如果一個key不存在,就報錯,get不會,不存在只返回None #dict.get(key, default=None) #返回指定鍵的值,如果值不在字典中返回default值 #比較安全的查找方法 print (info.get('stu6')) #其他 print (info.values()) #打印所有的值(即除了key) print (info.keys()) #打印所有的key print (info.items()) #把字典轉化為列表 # dict.setdefault(key, default=None) # 和get()類似, 但如果鍵不存在於字典中,將會添加鍵並將值設為default info.setdefault ('class3',{'Xiao Rui', 15}) print (info) info.setdefault ('class1',{'Xiao Hong', 16}) print (info) #循環打印 for i in info: print (i,info[i]) for k,v in info.items(): print (k, v) #多級字典嵌套及操作 info = { 'class1':{ 'stu1':["Xiao Ming",16] }, 'class2':{ 'stu2':["Xiao Liang",17] } } info['class1']['stu1'][1] = 18 print (info) #dict.fromkeys(seq[, val])) # 創建一個新字典,以序列 seq 中元素做字典的鍵,val 為字典所有鍵對應的初始值 eg: print (dict.fromkeys([6,7,8],'test')) c = dict.fromkeys([6,7,8],[1,{'name':'frui'}]) c[6][1]['name'] = 'sorui' print (c) #update方法 info = { 'stu1':"Xiao Ming", 'stu2':"Xiao Liang", 'stu3':"Xiao Hong", 'stu4':"Xiao Rui", } b = { 'stu1': "Xiao Dong", 1:3, 2:4 } print (info) info.update(b)
- 為什么dict查找速度這么快?
因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往后翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。
第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼,然后直接翻到該頁,找到這個字。無論找哪個字,這種查找速度都非常快,不會隨着字典大小的增加而變慢。dict就是第二種實現方式。
- 和list比較,dict有以下幾個特點:
無序
查找和插入的速度極快,不會隨着key的增加而變慢;
需要占用大量的內存,內存浪費多。
而list相反:
查找和插入的時間隨着元素的增加而增加;
占用空間小,浪費內存很少。
所以,dict是用空間來換取時間的一種方法。
- dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象。這是因為dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的算法稱為哈希算法(Hash)。
- 要保證hash的正確性,作為key的對象就不能變。在Python中,字符串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key:
4 集合
集合是一個無序的,不重復的數據組合,它的主要作用如下:
- 去重,把一個列表變成集合,就自動去重了
- 關系測試,測試兩組數據之前的交集、差集、並集等關系
常用操作
#去重 list1 = [3,2,1,4,5,6,5,4,3,2,1] print (list1, type(list1)) list1 = set(list1) print (list1, type(list1)) list2 = set([4,5,6,7,8,9]) #交集 print (list1.intersection(list2)) #並集 print (list1.union(list2)) #差集 print (list1.difference(list2)) print (list2.difference(list1)) #子集、父集 print (list1.issubset(list2)) print (list1.issuperset(list2)) list3 = set([4,5,6]) print (list3.issubset(list2)) print (list2.issuperset(list3)) #對稱差集 print (list1.symmetric_difference(list2)) #Return True if two sets have a null intersection list4 = set([1,2,3]) print (list3.isdisjoint(list4)) #交集 print (list1 & list2) #union print (list2 | list1) #difference print (list1 - list2) #對稱差集 print (list1 ^ list2) #添加 list1.add(999) #添加一項 print (list1) list1.update([66,77,88]) #添加多項 print (list1) print (list1.add(999)) #猜猜打印什么?為什么 #刪除 list1.remove(999) print (list1) #remove and return arbitrary set element print (list1.pop()) #Remove an element from a set if it is a member.If the element is not a member, do nothing. print (list1.discard(888))