Python 序列通用操作介紹

weixin_34119545發表於2015-09-04

上一篇:python字串基礎一

下一篇:Python 列表操作簡介

序列概覽

Python包含6種內建的序列:列表、元組、字串 、Unicode字串、buffer物件、xrange物件。在序列中的每個元素都有自己的編號。列表與元組的區別在於,列表是可以修改,而組元不可修改。理論上幾乎所有情況下元組都可以用列表來代替。有個例外是但元組作為字典的鍵時,在這種情況下,因為鍵不可修改,所以就不能使用列表。

我們先來編寫一個列表:

使用方括號括起來,列表元素使用逗號進行分隔:

>>> a = ["hello",100]
>>> a
['hello', 100]
>>> 

序列是可以巢狀的:

>>> A =["xiaoming",98]
>>> B =["xiaohong",87]
>>> grade=[A,B]
>>> grade
[['xiaoming', 98], ['xiaohong', 87]]
>>> 

下面來介紹一下通用的序列操作。

通用序列操作

所有序列都可以進行如下操作:

  • 索引
  • 分片
  • 檢查某個元素是否屬於序列成員(成員資格)

並且python提供了一些序列內建函式:

  • 計算序列長度
  • 找出做大元素及做小元素

另外序列操作還有迭代,這個以後介紹。
下面就這些操作做一個介紹

索引

序列的索引

索引即標號,及元素在序列中的編號。這些編號從0開始遞增,0表示第一個元素:

>>> world = "Hello Word"
>>> world[0]
'H'
>>> world[3] #第四個元素
'l'
>>> 

用法就如C語言的陣列一樣。在python中比較神奇的是,索引可以是負數:使用負數時,Python會從右邊向左邊計數,最後一個元素的索引值為-1,為啥不是-0呢?因為會和第一個元素重合:

>>> world = "Hello Word"
>>> world[0]
'H'
>>> world[3]
'l'
>>> world[-1]#從右邊開始計數
'd'
>>> world[-2]
'r'
>>> 

字串字面值的索引

字串字面值可以直接使用索引,不需要定義一個變數來引用這個字串字面值,這和C語言不一樣:

>>> "Hello Word"[1]
'e'
>>> 

在函式返回值使用索引

有一些函式的返回值為字串,有的返回其他的序列,我們可以在函式呼叫之後使用[]來對返回序列的元素值進行索引。

>>> input("input something:")[1]
input something:Hello word
'e'
>>> 

示例小程式

在這個例子中我們使用序列來儲存12個月份的單詞字串與每月天數的數字字尾。程式的目的是輸入年月日後進行序列索引查詢對應的單詞並輸出結果:


>>> 
Year:2015
Month:9
Day:4
4th September 2015
>>> 

程式清單1

months =[
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'Octber',
    'November',
    'December',
    ]
endings=['st','nd','rd']+17*['th']\
         +['st','nd','rd']+7*['th']\
         +['st']

year = input('Year:')
month = input('Month:')
day = input('Day:')
print(day+endings[int(day)-1]+' '+months[int(month)-1]+' ' +year)

注意點:

  • 在序列前乘以一個數字x,表示重複序列元素x次並存入序列中:
>>> a = 5*['a','b']
>>> a
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
>>> 

分片

分片即提取一個範圍內的序列,語法是:

序列名(或字串字面值)[a:b] 提取索引a~b範圍內的子序列。

>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> number[1:5]
[2, 3, 4, 5]
>>> 

注意點:

  • 範圍採用左閉右開,即第一個索引元素包含在分片內,第二個則不包含在分片內。就像C++容器採取的迭代器策略一樣。

  • 右索引超出範圍時,分片直接取到序列最後一個元素:

>>> number[0:19]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 
  • 左索引比右索引的元素在序列中出現得晚時,分片為空序列:
>>> number[-3:1]
[]
>>> 
  • 忽略右索引,分片將直接取到最後一個索引:
>>> number[0:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 
  • 同樣的,忽略左索引時:
>>> number[:10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 
  • 自然的,同時忽略兩個索引,整個序列都成為分片了:
>>> number[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 

分片的步長

分片的步長指的是,在分片索引標記的範圍內,多長的距離取樣一個值構成分配。在上面展示的程式碼中,步長都是為1的,也即範圍內所有元素都被取樣。我們可以設定分片步長:

number[a?️L] L即步長

>>> number[0:10:2]
[1, 3, 5, 7, 9]
>>> 

注意:

  • 步長不能為0
  • 步長可以為負數,表示從右向左提取元素。

序列相加

序列相加就簡單了。不羅嗦了。

>>> num1=[1,2,3,4,5]
>>> num2=[6,7,8,9,10]
>>> num3=num1+num2
>>> num3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 

序列相乘

序列相乘其實在上面說過了,用數字x乘以一個序列會產生新的序列,在新的序列中,原來的序列將被重複x次。

>>> 'Python'*5
'PythonPythonPythonPythonPython'
>>> 
>>> world=["hello "]
>>> world2=5*world
>>> world
['hello ']
>>> world2
['hello ', 'hello ', 'hello ', 'hello ', 'hello ']
>>> 

使用None建立有長度的空序列

None是Python的內建值。它的確切含義是“什麼也沒有”,我們如果要初始化一個長度為10的列表,而不在列表中放實際內容,就可以使用Node:

>>> sequence = 10*[None]
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
>>> 

成員資格

成員資格指某值是否在序列中,使用in運算子,運算子結果為布林值True 或者 False,語法如下:

'某值' in 序列

>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> 1 in number
True
>>> 11 in number
False
>>> 

序列長度、最小值和最大值

分別對應三個內建函式:

  • len()
  • min()
  • max()

簡單易用,這裡看一看就明白了:

>>> number = [1,2,3,4,5,6,7,8,9,10]
>>> len(number)
10
>>> min(number)
1
>>> max(number)
10
>>> 

對於字串值組成的序列,值大小的比較實用字串的比較規則:

>>> months =[
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'Octber',
    'November',
    'December',
    ]
>>> len(months)
12
>>> min(months)
'April'
>>> max(months)
'September'
>>> 

具體序列型別如元組、列表等的介紹,在下一篇文章中進行。

多謝看完文章,如所記有差錯懇請指出。

相關文章