首頁>技術>

作者 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'}

delpop方法可以刪除鍵值對:

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

7
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 第3期 | Psychopy:從flanker正規化看完整程式