1. 程式人生 > >Python學習筆記:序列操作

Python學習筆記:序列操作

1、通用序列操作

Python中所有序列都可以進行一些特定操作,包括索引(indexing)、分片(slicing)、序列相加(adding)、乘法(multiplying)、成員資格、長度、最小值和最大值。

1)索引

序列是Python中最基本的資料結構。序列中的每一個元素都分配一個數字,代表它在序列中的位置(索引),第一個索引是0,第二個索引是1,以此類推。

這裡的編號就是索引,可以通過索引獲取元素。所有序列都可以通過這種方式進行索引。

在Python中,從左向右索引稱為正數索引,從右向左索引稱為負數索引。使用負數索引時,Python會從最後一個元素開始計數。最後一個元素的位置編號是-1。

2)分片

索引用來對單個元素進行訪問,使用分片可以對一定範圍內的元素進行訪問,分片通過冒號相隔的兩個索引實現。

分片操作的實現需要提供兩個索引作為邊界,第一個索引的元素包括在分片內,第二個索引的元素不包括在分片內。想數學裡的a<=x<b,x是我們需要得到的元素,a是分片操作中的第一個索引,b是第二個索引,b不包含在x的範圍內。如果在分片中最左邊的索引比它右邊的索引晚出現在序列中,結果就是一個空序列。如果需要取得的分片包括序列結尾的元素,只需將第二個索引設定為空即可。Python為我們提供了另一個引數 – 步長,該引數通常是隱式設定的。

對於正數步長,Python會從序列的頭部開始向右提取元素,直到最後一個元素;對於負數步長,則是從序列的尾部開始向左提取元素,直到第一個元素。正數步長必須讓開始點小於結束點,而負數步長必須讓開始點大於結束點。

3)常用函式和方法

函式 描述
+ 使用加號可以進行序列的連線操作,原序列內容沒有改變,數字序列可以和數字序列通過加號連線,連線後的結果還是數字序列;字串序列也可以通過加號連線,連線後的結果還是字串序列;數字序列和字串序列不能通過加號連線
* 一個數x乘以一個序列會生成新的序列,原來的序列將被重複x次
s[i] 訪問指定下標元素
s[i:j] 訪問指定範圍元素
s[i:j:k]
in 檢測字元或數字是否在對應的列表中,返回值為True或False,數字型別不能再字串型別中通過in進行成員資格檢測,而字串型別可以在數字列表中通過in進行成員資格檢測
not in 判斷成員不在序列中
len() 求序列中的長度,並將之返回 PS:從1開始計數,沒有計算結束標誌位
min() 求序列中的最小值,並將之返回(ASCII順序)
max() 求序列中的最大值,並將之返回(ASCII順序)
sum() 統計求和
.index() 檢索元素第一次出現下標
.count() 統計元素出現的次數
del obj 刪除物件 或物件中的元素

注:
雖然從名稱上看,del語句代表的是刪除,但是實際上del語句的作用並不一定是刪除資料。應用於某些物件引用(引用的是非組合型別的資料項)時,del語句的作用是取消該物件引用到資料項的繫結,並刪除物件引用。

物件引用被刪除後,如果該物件引用所引用的資料項沒有被其他物件引用進行引用,那麼該資料項將進入垃圾收集流程。

用於組合資料型別(列表或元組)時,del語句刪除的只是對組合型別的物件引用。如果該物件引用所引用的組合型別資料沒有被其他物件引用進行引用,那麼該組合型別資料及其項(對於本身也是組合型別的項進行遞迴處理)將進入垃圾收集流程。

對於可變的組合資料型別,比如列表,del可應用於單個數據項或其中的資料片 — 兩種情況都需要使用分片操作符 [ ]。如果引用的單個或多個數據項從組合型別資料中移除,並且沒有其他物件引用對其進行引用,就進入垃圾收集流程。

2、列表 list[ ]

序列是Python中最基本的資料結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。

  • 可包含任意物件的有序集合
  • 通過下標索引(位置偏移)訪問元素
  • 可變長度,異質,客人已巢狀
  • 支援原位改變
  • 物件引用陣列

序列都可以進行的操作包括索引,切片,加,乘,檢查成員。

列表是最常用的Python資料型別,它可以作為一個方括號內的逗號分隔值出現。列表的資料項不需要具有相同的型別,建立一個列表,只要把逗號分隔的不同的資料項使用方括號括起來即可。

1)更新列表

有關序列的操作,如:索引、分片、相加、乘法等都適用於列表,而下面介紹的適用於列表不適用於序列,這些方法的作用都是更新列表。

元素賦值 描述
賦值說明 可以通過編號標記某個特定位置的元素,並對該位置的元素重新賦值;並且可以對一個列表的元素賦不同型別的值;不能超出列表的範圍賦值,即不能為一個不存在元素的位置賦值;
分片賦值 list()函式可以直接將字串轉化為列表;該函式的一個功能就是根據字串建立列表,有時這麼操作會很方便。List()函式不僅適用於字串,所有型別的序列它都適用;
改變某個位置元素 list[i]=x
改變特定範圍內元素 s[i,j]=[]新替換的物件必須為可迭代序列;替換的序列將替換的元素刪除之後替換,即被替換的範圍元素全部刪除,增加新元素;新增元素個數可小於、等於或大於替換元素個數;s[i,j,k]=[]有步長時,新替換的元素必須為可迭序列;替換元素個數必須和被替換元素的個數保持一致;

2)刪除元素

方法 描述
del list 刪除列表
del list[i] 刪除某個特定元素
del list[i:] 刪除指定範圍元素
del list[i:j:k] 刪除指定範圍元素,帶步長
list[:j]=[] 賦空值等同於刪除指定範圍元素
list[i:j:k]=[]*x 帶步長賦值空時,個數x一定要和替換個數保持一致
list.remove(x) 刪除第一個匹配值
list.clear() 清空序列,序列為空:[]

3)巢狀和多維列表

在列表中可以巢狀列表,巢狀的列表取出後還是列表。

>>>field=[‘a’,‘b’,‘c’]
>>>num=[1,2,3]
>>>mix=[field,num]
[[‘a’,‘b’,‘c’],[ 1,2,3]]

b_list = [[1,2,3],
           [4,5,6],
           [7,8,9]]
print(b_list[1])
[4,5,6]
print(b_list[2][1])
8

4)列表函式和方法

方法是與物件有緊密聯絡的函式,物件可能是列表、數字,也可能是字串或其他型別的物件。方法的呼叫格式:

物件.方法(引數) 

方法的定義方式是將物件放到方法名之前,兩者之間用一個點號隔開,方法後面的括號中可以根據需要帶上引數。

列表方法 描述
append() 用於在列表末尾新增新物件的方法。功能是在列表的末尾新增新物件
extend() 多用於在列表末尾一次性追加另一個序列中的多個值(用新列表擴充套件原來的列表);extend()方法和序列相加的主要區別是:extend()方法修改了被擴充套件的序列,原始的連線操作會返回一個全新的列表,返回的是一個包含list和seq副本的新列表,而不會修改原始的變數。
insert() 用於在列表index索引位置插入新元素obj
count() 用於統計某個元素在列表中出現的次數
index() 用於從列表中找出某個值第一個匹配項的索引位置
pop() pop()方法用於移除列表中的一個元素(不傳引數時,預設為最後一個元素),並返回該元素的值;pop()方法是唯一一個既能修改列表又能返回元素值(除None)的列表方法。使用pop方法可以實現一種常見的資料結構—棧。棧的原理就像堆放盤子一樣,一次操作一個盤子,要將若干個盤子堆成一堆,只能在一個盤子的上面放另一個盤子;要拿盤子時,只能從頂部一個一個往下拿,最後放入的盤子時最先被拿的。棧也是如此,最後放入棧的最先被移除,稱為LIFO(last in first out),即後進先出。 棧中的放入和移除操作有統一稱謂 ---- 入棧(push)和出棧(pop)。Python沒有入棧方法,但可以使用append方法替代,pop方法和append方法的操作結果恰好相反,如果入棧(或追加)剛剛出棧的值,最後得到的結果就不會變
remove() 用於移除列表中某個值的第一個匹配項,remove方法是一個沒有返回值得原位置元素變更方法,它修改了列表卻沒有返回值,與pop方法正好相反
clear() clear()方法用於清空列表,類似於del a[:],clear()方法會清空整個列表,呼叫該方法進行清空很簡單,但也要小心,因為一不小心就可能把整個列表都清空。

5)複製與排序

函式 描述
copy() 等同於list_c = list[:] 如果使用賦值 list_c = list 則會出現共享引用,copy()方法用於賦值列表,類似於 a[:]。簡單的使用等號 (=)複製,會出現共享引用,為了避免共享引用,可以採取list.copy()方法或者list_c = list[:]。此語法中list不需要傳入引數 這裡寫圖片描述
reverse() reverse()方法用於反向列表中的元素。此語法不需要傳入引數,且該方法改變了列表但不返回值,此方法只刪除第一個匹配值。如果需要對一個序列進行反向迭代,那麼可以使用reverse方法,這個方法並不返回列表,而是返回一個迭代器物件,可以通過list函式把返回的物件轉換為列表
sort() list.sort(key = None , reverse =False) 預設從小到大排序。sort()方法用於對原列表進行排序,指定引數,就使用引數指定的比較方法進行排序;sort()方法有兩個可選引數,即key和reverse。引數key,引數reverse預設False時為從小到大排序,reverse=True時,則為從大到小排序。注:當用戶需要一個排好序的列表副本,同時又保留原有列表不變時
sorted() list_n = sorted(list)如reverse()方法一樣,sort()方法也有一個同樣功能的函式 ---- sorted()函式;該函式可以直接獲取列表的副本進行排序。sorted()方法可以用於任何序列,返回結果都是一個列表

6)將列表當做堆疊使用

列表方法使得列表可以很方便的作為一個堆疊來使用,堆疊作為特定的資料結構,最先進入的元素最後一個被釋放(後進先出)。用 append() 方法可以把一個元素新增到堆疊頂。用不指定索引的 pop() 方法可以把一個元素從堆疊頂釋放出來。例如:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

7)將列表當作佇列使用

也可以把列表當做佇列用,只是在佇列裡第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。在列表的最後新增或者彈出元素速度快,然而在列表裡插入或者從頭部彈出速度卻不快(因為所有其他的元素都得一個一個地移動)。

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")           # Terry arrives
>>> queue.append("Graham")          # Graham arrives
>>> queue.popleft()                 # The first to arrive now leaves
'Eric'
>>> queue.popleft()                 # The second to arrive now leaves
'John'
>>> queue                           # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

8)列表推導式

列表推導式提供了從序列建立列表的簡單途徑。通常應用程式將一些操作應用於某個序列的每個元素,用其獲得的結果作為生成新列表的元素,或者根據確定的判定條件建立子序列。

每個列表推導式都在 for 之後跟一個表示式,然後有零到多個 for 或 if 子句。返回結果是一個根據表達從其後的 for 和 if 上下文環境中生成出來的列表。如果希望表示式推匯出一個元組,就必須使用括號。

這裡我們將列表中每個數值乘三,獲得一個新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

現在我們玩一點小花樣:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

這裡我們對序列裡每一個元素逐個呼叫某方法:

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

我們可以用 if 子句作為過濾器:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

以下是一些關於迴圈和其它技巧的演示:

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

列表推導式可以使用複雜表示式或巢狀函式:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

3、元組 tuple()

Python的元組和列表類似,不同之處在於元組的元素不能修改(前面提過的字串也是不能修改的)。元組一旦初試換就不能修改,元組只能從新賦值時才可以修改。不可變的元組有什麼意義?因為元組不可變,所以程式碼更安全。

  • 可包含任意型別的有序集合
  • 固定長度,異質
  • 可任意巢狀
  • 通過下標索引(位置偏移)訪問元素
  • 物件引用陣列

1)建立元組##

元組也可以使用tuple()函式建立,空元祖是使用圓括號()建立的,包含一個或多個項的元組則可以使用逗號分隔進行建立。

建立元組的方法很簡單:使用逗號分隔一些值,就會自動建立元組。

>>>(1,2,3)
(1,2,3)
>>>(‘hello’ , ‘world’)
(‘hello’ , ‘wor`這裡寫代`這裡寫程式碼片`碼片`ld’)
>>>()
()
>>>(1)                       #錯誤,結果不是元組
(1)`這裡寫程式碼片
>>>(1,)                      #正確,結果是元組
(1,)

還可以使用圓括號將值括起來,以及建立空元祖,圓括號不包含任何內容,就是一個空元祖,建立一個值得元組時,必須在括號中的元素後加上一個逗號
當元組只有一個元素的時候,必須注意在該元素結尾加上 “,”,以區分變數。

內建函式 描述
tuple() tuple()函式的功能和list()函式基本上一樣,都是以一個序列作為引數,並把它轉換為元組。如果引數是元組,引數就會被原樣返回
tuple(list) 用於將列表轉換為元組

2)訪問元組

可以使用下標索引訪問元祖中的值

>>>mix = (‘hello’ , ‘world’ , 2015 ,2016)
>>>print(“mix [1] is:, mix[1])
mix [1] is: world
>>>num = (1,2,3,4,5,6,7)
>>>print(“num [1:5] is :, num[1:5])
num[1:5] is : (2,3,4,5)

3)修改元組

>>>field = ('hello’ , ‘world’)
>>>num = (2015,2016)
>>>print(“合併結果為:” , field + num)
合併結果為:('hello’ , ‘world’ , 2015,2016)

元組中的元素不允許修改,但可以對元組進行連線組合。

4)刪除元祖

>>>field =(‘hello’ , ‘world’)
>>>del field
>>>print(‘刪除後的結果:’ , field)
Traceback (most recent call last):
        Field “<pyshell#84>”,line 1,in <module>
    print(‘刪除後的結果:’, field)
NameError : name ‘field’ is not deefined

元組中的元素值不允許刪除,但可以使用del語句刪除整個元組。元祖被刪除後,輸出變數會有異常資訊,輸出結果顯示沒有定義field,即field已經不存在了。

5)元祖索引、擷取

因為元組也是一個序列,所以可以訪問元祖中指定位置的元素,也可以擷取索引中的一段元素。

>>>field = (‘hello’ , ‘world’ , ‘welcome’)
>>>field[2]
‘welcome’
>>>[-2]
‘world’
>>>field[1:]
(‘world’ , ‘welcome’)

4、range

Python3 range() 函式返回的是一個可迭代物件(型別是物件),而不是列表型別, 所以列印的時候不會列印列表。

range()一般生成數值序列,以便執行待定次數的迴圈,型別為range型別。
同元組一樣,不支援原位改變。

Python3 list() 函式是物件迭代器,可以把range()返回的可迭代物件轉為一個列表,返回的變數型別為列表。

函式語法

range(stop)
range(start,stop, [step])

引數說明:
start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5);
stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1)