1. 程式人生 > >Python入門七資料結構

Python入門七資料結構

1.List集合型別

list.append(x); 在集合的末尾新增新的元素
list.extend(x); 在當前元素末尾新增另一個集合中的所有元素

list.insert(i,x);    在集合的指定位置插入元素,需要注意的是不能這樣直接插入另一個元素集合

正確做法應該是這樣的

當然如果我們不在乎插入的順序也可以這樣寫

list.remove(x)  刪除集合中的指定元素,注意這裡的引數不是集合中元素的下標,而是元素值

如果要刪除的元素不存在則會發生這樣的錯誤

list.pop(x)  刪除集合中的指定下標的元素,下標從0開始

list.index(x)  返回指定集合中第一個匹配元素的下標值

list.count(x) 返回元素值x在集合中出現的次數

list.sort()   有兩個可選關鍵字引數
              當沒有引數時,預設根據首字母或數字大小正序排序
              當指定key=xxx 時根據指定key進行排序 預設為首字母或數字大小
              當指定reverse=True 時進行倒序排序   預設為False

需要注意的是sort方法沒有返回值,它不會反回一個新的集合,而是在原有集合上進行修改

list.reverse()  與list.sort(reverse=True)效果相同
list.copy()  返回當前集合的副本相當於a[:]

使用集合作為堆疊

list方法可以很容易地將集合用作堆疊,其中新增的最後一個元素是檢索到的第一個元素(“last-in,first-out”)。要將項新增到堆疊頂部,請使用append()。要從堆疊頂部檢索專案,請在pop()沒有顯式索引的情況下使用。

使用列表作為佇列

也可以使用集合作為佇列,其中新增的第一個元素是檢索的第一個元素(“先進先出”); 但是,集合不能用於此目的。雖然集合末尾的追加和彈出很快,但是從集合的開頭進行插入或彈出是很慢的(因為所有其他元素都必須移動一個)

要實現佇列,請使用collections.deque設計為具有快速追加和從兩端彈出的佇列

集合理解

列表推導提供了建立列表的簡明方法。常見的應用是建立新的列表,其中每個元素是應用於另一個序列的每個成員或可迭代的一些操作的結果,或者建立滿足特定條件的那些元素的子序列

例如,假設我們要建立一個儲存正方形面積的列表,例如:

請注意,這會建立(或覆蓋)一個名為x在迴圈完成後仍然存在的變數。我們可以使用以下方法計算沒有任何副作用的正方形列表:

集合推導由括號組成,括號中包含一個表示式,後面跟一個for自居其中可包含多個for或if自居,結果將是一個新的集合,該集合是通過在後面自居的上線文中評估表示式而得到的。

例如:如果列表中的元素值不相等,則將兩個值組合存入集合中

更多的Demo

元組和序列

我們看到列表和字串有許多常見屬性,例如索引和切片操作。它們是序列資料型別的兩個示例(請參閱 序列型別 - 列表,元組,範圍)。由於Python是一種不斷髮展的語言,因此可能會新增其他序列資料型別。還有另一種標準序列資料型別:元組。

元組由逗號分隔的多個值組成,例如:

如您所見,輸出元組始終用括號括起來,以便正確解釋巢狀元組; 它們可以輸入有或沒有周圍的括號,儘管通常括號是必要的(如果元組是較大表達式的一部分)。無法分配元組的各個項,但是可以建立包含可變物件的元組,例如列表。

儘管元組看起來與列表類似,但它們通常用於不同的情況並用於不同的目的。元組是不可變的,並且通常包含異構的元素序列,這些元素可以通過解包(參見本節後面部分)或索引(或者甚至是屬性的情況下namedtuples)來訪問。列表是可變的,它們的元素通常是同類的,可以通過遍歷列表來訪問。

一個特殊的問題是構造包含0或1項的元組:語法有一些額外的怪癖來適應這些。空元組是由一對空括號構成的; 通過使用逗號跟隨值來構造具有一個專案的元組(在括號中包含單個值是不夠的)。

元組的序列解包

解包時需要注意的是接收元組元素的變數個數必須要與元組的元素個數相等

Set集合

字典

Python內建的另一個有用的資料型別是字典(請參閱 對映型別 - 字典)。詞典有時在其他語言中被稱為“關聯記憶”或“關聯陣列”。

與通過一系列數字索引的序列不同,字典由索引,可以是任何不可變型別; 字串和數字總是鍵。

如果元組僅包含字串,數字或元組,則它們可用作鍵; 如果元組直接或間接包含任何可變物件,則不能將其用作鍵。

你不能用連結串列做關鍵字,因為連結串列可以用索引賦值,切片賦值,或類似的方法進行修改append()和 extend()

最好將字典視為一組鍵:值對,並要求鍵是唯一的(在一個字典中)。一對大括號建立一個空字典:{}。在括號內放置以逗號分隔的鍵:值對列表,將初始鍵:值對新增到字典中; 這也是字典在輸出上的寫法。

字典上的主要操作是使用某個鍵儲存值並提取給定鍵的值。也可以刪除鍵:值對del。如果使用已在使用的金鑰進行儲存,則會忘記與該金鑰關聯的舊值。使用不存在的金鑰提取值是錯誤的。

list(d)在字典上執行會按照插入順序返回字典中使用的所有鍵的列表(如果您希望對其進行排序,則只需使用它 sorted(d))。要檢查單個鍵是否在字典中,請使用in關鍵字。

dict()構造直接從鍵-值對的序列構建字典:

dict comprehensions可用於從任意鍵和值表示式建立字典:

當鍵是簡單字串時,有時使用關鍵字引數指定對更容易

 

迴圈技術

遍歷字典

遍歷list

同時遍歷多個list

要反向迴圈序列,首先在正向指定序列,然後呼叫該reversed()函式。

由此可以推匯出,如何反向遍歷list

要按排序順序迴圈序列,請使用sorted()返回新排序列表的函式,同時保持源不變。

當你迴圈它時,有時很有可能改變一個列表; 但是,建立新列表通常更簡單,更安全。

關於更多條件

whileif語句中使用的條件可以包含任何運算子,而不僅僅是比較。

比較運算子in並檢查序列中是否出現(不發生)值。運算子並比較兩個物件是否真的是同一個物件; 這隻對像列表這樣的可變物件很重要。所有比較運算子具有相同的優先順序,低於所有數值運算子的優先順序。not inisisnot

比較可以連結。例如,測試是否小於,而且等於。a < b == cabbc

比較可以使用布林運算子進行組合andor,和一個比較的結果(或任何其它的布林表示式的)可以與否定not。這些優先順序低於比較運算子; 它們之間,not具有最高優先順序和or最低優先順序,因此相當於。與往常一樣,括號可用於表達所需的組成。A and not B or C(A and (not B)) or C

布林運算子andor所謂的短路 運算子:它們的引數從左到右進行計算,一旦確定結果,評估就會停止。例如,如果AC為true但B為false,則不評估表示式 。當用作一般值而不是布林值時,短路運算子的返回值是最後一個求值的引數。A and B and CC

可以將比較結果或其他布林表示式分配給變數。例如,

請注意,在Python中,與C不同,賦值不能出現在表示式中。C程式設計師可能會抱怨這一點,但它避免了C程式中遇到的常見問題:===預期時輸入表示式。

比較list和其他型別

可以將list物件與具有相同序列型別的其他物件進行比較。比較使用詞典排序:首先比較前兩個專案,如果它們不同,則確定比較的結果; 如果它們相等,則比較接下來的兩個專案,依此類推,直到任一序列用完為止。如果要比較的兩個項本身是相同型別的序列,則遞迴地執行詞典比較。如果兩個序列的所有專案相等,則認為序列相等。如果一個序列是另一個序列的初始子序列,則較短的序列是較小的(較小的)序列。字串的字典順序使用Unicode程式碼點編號來排序單個字元。相同型別序列之間比較的一些示例:

請注意,如果物件具有適當的比較方法,則將不同型別的物件與物件進行比較<或是>合法的。例如,混合數字型別根據它們的數值進行比較,因此0等於0.0等。否則,直譯器將引發TypeError異常,而不是提供任意排序