列表、字典、元組進階
列表、字典和元組是python中所有腳本的主要工作組件。
列表
列表中可包含任意種類的對象。和字符串一樣,他也支持序列的常規操作,指定偏移值和切片、合並以及叠代等序列操作。
與其他語言不同的是列表是一種高階的序列操作工具,python中的列表可以完成大多數幾何體數據結構的工作。
列表的主要屬性:
1.任意對象的有序集合:列表中收集任何python對象並且保持了從左往右的位置順序;
2.通過偏移量讀取;
3.可變長度、異構和任意長度:列表是可變數據類型,支持原處修改,其中元素可以是任意數據類型,包括列表字典。
4.對象引用:python總是會存儲對象的引用而不是對象的copy。
註:我們在學習時註重精通常量語法,但是現實生產中python的多數據結構都是建立在運行執行程序代碼時。
列表的常規操作:
a=[1,2,‘a‘] b=[‘a‘,‘s‘,‘d‘] print(a+b) print(a*2) 運行結果: [1, 2, ‘a‘, ‘a‘, ‘s‘, ‘d‘] [1, 2, ‘a‘, 1, 2, ‘a‘]
列表的叠代與解析:
for i in a: print(i**2) 運行結果: 1 4 9
a=[1,2,3] print(i**2 for i in a) print(list(i**2 for i in a)) 運行結果: <generator object <genexpr> at 0x00000000027EBB40> [1, 4, 9]
a=[-1,2,3] print(list(map(abs, a))) 運行結果: [1, 2, 3]
由於列表多次嵌套,所以有時需要多次索引才能深入到數據結構中。
a=[[1,2,3], [4,5,6], [7,8,9]] print(a[2][1]) 運行結果: 8
切片賦值時被賦值序列長度可以與我們復制的序列長度不相同,故可以用此操作進行替換,插入,縮短主列表。並且賦值的值與切片重合也是切實可行的。例:a[2:5]=a[3:7]。
列表的常用方法:
append():與a+[x]不同的是,方法原地修改列表,而+會產生新的列表。所以append方法執行更快。
a=[1,2,3] a.append(4) print(a) 運行結果: [1, 2, 3, 4]
sort():可以給定配置選項,name=value來定義。
a=[‘aBC‘,‘abd‘,‘Abe‘] a.sort() print(a) a.sort(key=str.upper,reverse=True) print(a) 運行結果: [‘Abe‘, ‘aBC‘, ‘abd‘] [‘Abe‘, ‘abd‘, ‘aBC‘]
註:在python2中比較時int總比str小,比較運算並不會自動轉換類型,到了python3以後類型之間有了明確的界限,[1,2,‘a‘]這用列表已經不可以用sort方法排序了。
a=[‘aBC‘,‘abd‘,‘Abe‘] print(sorted(a)) 運行結果: [‘Abe‘, ‘aBC‘, ‘abd‘]
其他常用方法:
a=[‘aBC‘,‘abd‘,‘Abe‘] a.extend([‘a‘]) print(a) 運行結果: [‘aBC‘, ‘abd‘, ‘Abe‘, ‘a‘]
a=[‘aBC‘,‘abd‘,‘Abe‘] a.pop() print(a) 運行結果: [‘aBC‘, ‘abd‘]
a=[‘aBC‘,‘abd‘,‘Abe‘] a.reverse() print(a) print(list(reversed(a))) 運行結果: [‘Abe‘, ‘abd‘, ‘aBC‘] [‘aBC‘, ‘abd‘, ‘Abe‘]
a=[‘aBC‘,‘abd‘,‘Abe‘] a.insert(0,‘a‘) print(a) print(a.index(‘a‘)) a.remove(‘a‘) print(a) print(a.pop(1)) 運行結果: [‘a‘, ‘aBC‘, ‘abd‘, ‘Abe‘] 0 [‘aBC‘, ‘abd‘, ‘Abe‘] abd
註:a[i:j]=[]可以做到刪除,但是a[i]=[]只會將此索引位置改為空列表。
字典:
字典是一種無序的集合,是靠key來取值的序列。字典可以非常快速的進行一些其他語言的搜索算法和數據結構。
字典的主要屬性:
1.通過key而不是偏移量取值:字典有自己的hash表,通過鍵來取值。
2.任意對象無需集合:字典並沒有特定的順序,實際上key提供了象征性的位置作用。
3.與列表一樣字典可變長、異構、任意嵌套。
4.屬於可變映射類型。
5.對象引用表:采用最優化的散列算法來尋找key,搜索速度極快,並且與列表一樣存儲對象是引用而不是拷貝。
字典的常用操作:
a={‘name‘:‘jeff‘,‘age‘:‘111‘} print(list(a.keys())) 運行結果: [‘name‘, ‘age‘]
a={‘name‘:‘jeff‘,‘age‘:‘111‘} print(‘name‘ in a) 運行結果: Ture
a={‘name‘:‘jeff‘,‘age‘:‘111‘} a[‘name‘]=‘frank‘ print(a) 運行結果: {‘name‘: ‘frank‘, ‘age‘: ‘111‘}
a={‘name‘:‘jeff‘,‘age‘:‘111‘} a[‘like‘]=‘game‘ print(a) 運行結果: {‘name‘: ‘jeff‘, ‘like‘: ‘game‘, ‘age‘: ‘111‘}
a={‘name‘:‘jeff‘,‘age‘:‘111‘} a[‘like‘]=‘game‘ del a[‘like‘] print(a) 運行結果: {‘age‘: ‘111‘, ‘name‘: ‘jeff‘}
字典常用方法:
a={‘name‘:‘jeff‘,‘age‘:‘111‘} print(list(a.values())) print(list(a.items())) 運行結果: [‘jeff‘, ‘111‘] [(‘name‘, ‘jeff‘), (‘age‘, ‘111‘)]
get():檢查key是否在,並返回某個值,默認None。
a={‘name‘:‘jeff‘,‘age‘:‘111‘} print(a.get(‘name‘,‘no‘)) print(a.get(‘like‘,‘no‘)) 運行結果: jeff no
update():更新沒有的,並且盲目覆蓋已有的值。
a={‘name‘:‘jeff‘,‘age‘:‘111‘} a.update({‘like‘:‘game‘}) print(a) 運行結果: {‘name‘: ‘jeff‘, ‘like‘: ‘game‘, ‘age‘: ‘111‘}
pop():
a={‘name‘:‘jeff‘,‘age‘:‘111‘} a.pop(‘age‘) print(a) 運行結果: {‘name‘: ‘jeff‘}
註:字典的鍵不一定都是字符串,當然不可能是列表啦,字典的鍵可以是任何不可變對象。
小技巧:制作一個字典讓他用起來很像一個列表。
a={0:‘jeff‘,1:‘111‘} print(a[0]) 運行結果: jeff
值得一提的是讀取不存在的鍵時常會報錯,而在一些場景我們並不希望報錯,我們可以采取以下三種方式進行避免:
1.if先對鍵進行判斷再使用。
a={0:‘jeff‘,1:‘111‘} if 2 in a: print(a[0]) else: print(‘none‘) 運行結果: none
2.try語句修復
a={0:‘jeff‘,1:‘111‘} try: print(a[2]) except KeyError: print(‘none‘) 運行結果: none
3.get()
a={0:‘jeff‘,1:‘111‘} print(a.get(2,‘none‘)) 運行結果: none
字典取代了搜索數據結構,在嵌套時輕松表達結構化信息。
註:字典接口適用於python各種內置工具。
字典的4中創建方法:
a={0:‘jeff‘,1:‘111‘} print(a) 運行結果: {0: ‘jeff‘, 1: ‘111‘}
a={} a[‘name‘]=‘jeff‘ print(a) 運行結果: {‘name‘: ‘jeff‘}
a=dict(name=‘jeff‘) print(a) 運行結果: {‘name‘: ‘jeff‘}
a=dict([(‘name‘,‘jeff‘)]) print(a) 運行結果: {‘name‘: ‘jeff‘}
如果事先就能拼出整個字典,就使用第一種創建方式,如果需要動態創建字典的某個字段則使用第二種方式,第三種方式的key必須是字符串,第四種方式需要在運行時把key好的value逐步建成序列。
python3中字典做出了哪些改變:
1.支持字典解析表達式;
2.調用a.keys、a.values、a.items方法需要使用list使其可視化;
3.不再支持大小比較,相等性測試依然存在;
4.取消has_key方法,只使用in判斷成員關系,當然get方法也是可行的。
字典解析:
a={k:v for (k,v) in zip([1,2,3],[‘a‘,‘s‘,‘d‘])} print(a) 運行結果: {1: ‘a‘, 2: ‘s‘, 3: ‘d‘}
keys,values,items返回的都是可叠代視圖對象,如果想用列表操作或者顯示他們的值,必須通過內置函數list來完成。當然這種試圖既然是可叠代對象,我們還可以使用for循環叠代查看。此外遍歷key的方法直接使用for i in {}即可,不一定要是用key方法。並且python3可以動態反映在視圖創建對象後對字典做出的修改。
註:python2keys不會反回一個列表,所以python2需要通過排序鍵來瀏覽一個字典的編碼模式。
小練習:創建字典,所有鍵的value都是0。
a={‘a‘:0,‘b‘:0...} print(a)
a={} a[‘a‘]=0 a[‘b‘]=0 . . . print(a)
a=dict(a=0,b=0...) print(a)
a=dict([(‘a‘,0),(‘b‘,0)...]) print(a)
a=dict.fromkeys([‘a‘,‘b‘...],0) print(a)
a={k:0 for k in ‘ab...‘} print(a)
元組
元組基本屬性:
1.任意對象有序集合:這點與列表一致;
2.通過偏移存取;
3.固定長度、異構任意嵌套:因為元組是不可變序列類型;
4.引用對象而非copy。
元組和其他兩種序列不同的是他沒有方法,還是因為他的不可變性,可能根本就不需要什麽方法吧。
這裏值得註意的是定義只有單個元素的元組的情況:
a=(‘a‘) b=(‘a‘,) print(a) print(b) 運行結果: a (‘a‘,)
在python裏,括號在大所屬情況下是可以忽略的,僅當元組作為常量穿個函數調用和元組在python2中print語句中列出時才必不可少。對於初學者可能對概念模糊不清,所以建議當前還是使用括號更好。
如果想要操作元組,可以將其轉化為倆表對象進行操作,然後再轉化為元組,在進行排序的操作時可以使用sorted函數來完成,此函數接受任何序列對象。
列表解析可以用於元組轉換,列表解析甚至可以用在某些並非實際存儲的序列之上,任何遍歷對象都可以,包括逐行讀取文件。
註:元組也不是完全沒有方法,index和count在元組中也是可以工作的。並且元組的不可變性只是本身,不包括它內部的元素,如果元組的內部是列表元素,那他依然可以進行修改列表。
其他python對象及類型
篇幅有限簡單介紹一下python的其他類型。
None對象
python特殊數據類型的唯一值,一般都起到一個空的占位作用。None不意味著無意義,None是某些內容,盡管是沒有意義的意思,但是他是一個真正的對象,並且他有一塊內存存放,python給定一個內置的名稱。他還是函數的返回值。
bool類型
當明確地用在真值測試,真假就是1和0.交互模式下進行布爾測試結果也是打印成Ture與False。python內置函數bool()用於測試對象的真假。
type對象
即使是類型本身在python中也是有對象的。
print(type(type)) 運行結果: <class ‘type‘>
python還定義了isinstance來作為類型判斷內置函數。
註:最後一點復合對象指向自身的引用,成為循環,python在對象中檢測到循環就會打印成[...]而不會陷入無限的循環。
l=[1,2,3] l.append(l) print(l) 運行結果: [1, 2, 3, [...]]
除了這些核心對象以外,還有函數,模塊和類的內核心數據類型,在之後的學習過程中,一一分享給大家。
列表、字典、元組進階