作者 Yuan
目錄
元組列表字典集合Python的資料結構和序列本篇寫的是Python的內建功能,從最基本的資料結構開始:元組,列表,字典和集合。
元組
元組是一個固定長度,不可改變的Python序列物件。建立元組的最簡單方式,是用逗號分隔一組值:
In [1]: tup = 4, 5, 6In [2]: tupOut[2]: (4, 5, 6)
或者把值放入括號裡面:
In [3]: tup = (4, 5, 6), (7, 8)In [4]: tupOut[4]: ((4, 5, 6), (7, 8))
用tuple可以將任意序列或迭代器轉換成元組:
In [5]: tuple([4, 0, 2])Out[5]: (4, 0, 2)In [6]: tuple('string')Out[6]: ('s', 't', 'r', 'i', 'n', 'g')
可以用方括號訪問元組中的元素,序列從0開始:
In [7]: tup = tuple('string')In [8]: tup[0]Out[8]: 's'
可以用加號運算子將元組合並:
In [9]: (4, None, 'foo') + (6, 0) + ('bar',)Out[9]: (4, None, 'foo', 6, 0, 'bar')
元組乘以一個整數會將幾個元組複製串聯起來:
In [10]: ('foo', 'bar') * 4Out[10]: ('foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar')
我們可以將元組賦給類似元組的變數
In [11]: tup = (4, 5, 6)In [12]: a, b, c = tupIn [13]: cOut[13]: 6
Python還有更高階的元組拆分功能,使用*rest(rest是任意名字)可以抓取剩下的元素:
In [14]: values = 1, 2, 3, 4, 5In [15]: a, b, *rest = valuesIn [16]: a, bOut[16]: (1, 2)In [17]: restOut[17]: [3, 4, 5]
如果rest部分不想要,許多程式設計師的慣用寫法是用下劃線代替不需要的變數名:
a, b, *_ = values
元組的大小和內容不能修改,所以元組的方法較少。但我們可以用count統計某個值出現的次數:
In [18]: a = (1, 2, 2, 2, 3, 4, 2)In [19]: a.count(2)Out[19]: 4
列表
與元組對比,列表的長度可變,內容可以被修改。可以用方括號或list函式定義:
a_list = [2, 3, 7, None]tup = ('foo', 'bar', 'baz')b_list = list(tup)
可以用append在列表末尾新增元素
In [20]: b_list = ['apple', 'banana', 'orange']In [21]: b_list.append('grape')In [22]: b_listOut[22]: ['apple', 'banana', 'orange', 'grape']
可以用insert在特定的位置插入元素:
In [23]: b_list.insert(1, 'peach')In [24]: b_listOut[24]: ['apple', 'peach', 'banana', 'orange', 'grape']
pop是insert的逆運算,它移除並返回指定位置的元素:
In [25]: b_list.pop(2)Out[25]: 'banana'
remove可以去除某個值,remove會先尋找第一個值併除去:
In [26]: b_list.append('apple')In [27]: b_listOut[27]: ['apple', 'peach', 'orange', 'grape', 'apple']In [28]: b_list.remove('apple')In [29]: b_listOut[29]: ['peach', 'orange', 'grape', 'apple']
in可以檢查列表是否包含某個值:
In [30]: 'orange' in b_listOut[30]: TrueIn [31]: 'orange' not in b_listOut[31]: False
在列表中檢查是否存在某個值遠比字典和集合速度慢,因為Python是線性搜尋列表中的值,但在字典和集合中同樣時間可以檢查更多項(基於雜湊表)。
2.串聯和組合列表
與元組類似,可以用加號將兩個列表合併
已經定義一個列表後,用extend方法可以追加多個元素:
In [32]: x = ['a', 'b', 'c']In [33]: x.extend(['d', 'e', 'f'])In [34]: xOut[34]: ['a', 'b', 'c', 'd', 'e', 'f']
透過加法將列表組合的計算量較大,因為要新建列表,再複製物件
3.排序
sort函式可以將一個列表原地排序
In [35]: a = [7, 2, 5, 1, 3]In [36]: a.sort()In [37]: aOut[37]: [1, 2, 3, 5, 7]
sort函式括號中可以加排序關鍵字key,例如按長度對字串進行排序:
In [38]: b = ['apple', 'orange', 'pie', 'lemon']In [39]: b.sort(key=len)In [40]: bOut[40]: ['pie', 'apple', 'lemon', 'orange']
sorted函式則可以產生一個排好序的副本
4.二分搜尋
bisect模組支援二分查詢和向已排序的列表插入值,bisect.bisect可以找到插入值後仍保持順序的位置,bisect.insort會向這個位置插入值:
In [41]: import bisectIn [42]: c = [1, 2, 2, 2, 3, 4, 7]In [43]: bisect.bisect(c, 2)Out[43]: 4In [44]: bisect.bisect(c, 5)Out[44]: 6In [45]: bisect.insort(c, 6)In [46]: cOut[46]: [1, 2, 2, 2, 3, 4, 6, 7]
5.切片
切片可以選取序列的一部分,基本形式是:
sequence[start:end]
In [47]: seq = [7, 2, 3, 7, 5, 6, 0, 1]In [48]: seq[1:5]Out[48]: [2, 3, 7, 5]
切片可以被序列賦值:
In [49]: seq[3:4] = [6, 3]In [50]: seqOut[50]: [7, 2, 3, 6, 3, 5, 6, 0, 1]
切片的開始和結束可以省略:
In [51]: seq[:5]Out[51]: [7, 2, 3, 6, 3]In [52]: seq[3:]Out[52]: [6, 3, 5, 6, 0, 1]
負數的話可以從後往前開始:
In [53]: seq[-4:]Out[53]: [5, 6, 0, 1]In [54]: seq[-6:-2]Out[54]: [6, 3, 5, 6]
透過第二個冒號可以選擇步伐:
In [55]: seq[::2]Out[55]: [7, 3, 3, 6, 1]
6.列表推導式
列表推導式允許使用者從一個集合方便的過濾元素或者修改元素:
In [56]: strings = {'a', 'as', 'bat', 'car', 'dove'}In [57]: [x.upper() for x in strings if len(x) > 2]Out[57]: ['DOVE', 'BAT', 'CAR']
這個列表推導式等同於
strings = ['a', 'as', 'bat', 'car', 'dove']a = []for x in strings: if len(x) > 2: a.append(x.upper())
字典
字典是鍵值對的可變集合,建立字典的方法之一是使用花括號,用冒號分隔鍵和值:
empty_dict = {}d1 = {'a':'some value', 'b':[1, 2, 3, 4]}
新增新的鍵值對:
In [58]: d1 = {'a':'some value', 'b':[1, 2, 3, 4]}In [59]: d1[7] = 'an integer'In [60]: d1Out[60]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
del和pop方法可以刪除鍵值對:
In [63]: d1['dummy'] = 'another value'In [64]: d1Out[64]:{'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer', 5: 'some value', 'dummy': 'another value'}In [65]: del d1[5]In [66]: d1Out[66]:{'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer', 'dummy': 'another value'}In [67]: ret = d1.pop('dummy')In [68]: retOut[68]: 'another value'In [69]: d1Out[69]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
檢視字典的鍵:
In [70]: list(d1.keys())Out[70]: ['a', 'b', 7]
檢視字典的值:
In [71]: list(d1.values())Out[71]: ['some value', [1, 2, 3, 4], 'an integer']
update方法可以將兩個字典融合:
In [72]: d1.update({'b':'foo', 'c':12})In [73]: d1Out[73]: {'a': 'some value', 'b': 'foo', 7: 'an integer', 'c': 12}
字典的鍵通常是不可變的標量型別(整數,浮點型,字串)或元組,字典的值可以是任意型別
集合集合是無序的不可重複的元素的集合。可以用set函式或花括號建立。
In [74]: set([2, 2, 2, 1, 3, 3])Out[74]: {1, 2, 3}In [75]: {2, 2, 2, 1, 3, 3}Out[75]: {1, 2, 3}
用union方法或|運算子對兩個集合求並集:
In [76]: a = {1, 2, 3, 4, 5}In [77]: b = {3, 4, 5, 6, 7, 8}In [78]: a.union(b)Out[78]: {1, 2, 3, 4, 5, 6, 7, 8}In [79]: a | bOut[79]: {1, 2, 3, 4, 5, 6, 7, 8}
用intersection或&運算子對兩個集合求交集:
In [80]: a.intersection(b)Out[80]: {3, 4, 5}In [81]: a & bOut[81]: {3, 4, 5}
下面這張表列出了常用的集合方法
下一篇的筆記是函式相關的,那下篇見吧!
—完—
作者 Yuan