1. 程式人生 > 程式設計 >Python序列物件與String型別內建方法詳解

Python序列物件與String型別內建方法詳解

本文例項講述了Python序列物件與String型別內建方法。分享給大家供大家參考,具體如下:

前言

在Python資料結構篇中介紹了Python的序列型別資料結構,這次繼續深入的學習序列和String型別物件的內建方法。

軟體環境

  • 系統
    • UbuntuKylin 14.04
  • 軟體
    • Python 2.7.3
    • IPython 4.0.0

序列型別

序列型別,即由整數進行索引的物件的有序集合。其中又可以分為下面兩類:
可變序列:列表,支援元素的插入、刪除、替換
不可變序列:元組、字串

序列的操作方法

序列本質上是由索引物件來指向記憶體中的資料物件,所以序列資料物件都支援迭代方式,也都能夠支援下列幾種操作。

索引呼叫

In [1]: li = [1,2,'name']
In [2]: li[0]
Out[2]: 1
In [3]: tp = (1,'name')
In [4]: tp[1]
Out[4]: 2
In [6]: str = 'Jmilk'
In [7]: str[2]
Out[7]: 'i'

切片運算子

sequenceName[x:y] ⇒ 切割出由索引X到y-1之間的元素。

注意:索引均由0開始。而且序列的切片操作會返回一個生成一個新的物件,不會讓原序列發生改變。

In [12]: li[:3]
Out[12]: [1,'name']
In [13]: li[1:3]
Out[13]: [2,'name']
In [14]: tp[1:3]
Out[14]: (2,'name')
In [15]: str[1:3]
Out[15]: 'mi'

擴充套件切片運算子

sequenceName[x:y:stride] ⇒ 除了切割除x到y-1直接的元素,再對這些元素以stride-1的步進(間隔)進行挑選。

擴充套件切片運算子能夠支援步進。即獲取下一個索引之間的間隔。

In [16]: str = 'My name is Jmilk!'
In [21]: str[1:10:2]
Out[21]: 'ynm s'

首先切割除第2到10個元素(空格也算一個),再每隔1個元素挑選一個元素。

序列元素的反轉

序列的索引還可以是負數,-1指向序列的最後一個元素,以此類推。Example:

In [30]: str[-1]
Out[30]: '!'
In [31]: tp[-1]
Out[31]: 'name'

還有下面兩種有趣的玩法:

反轉序列

In [27]: str
Out[27]: 'My name is Jmilk!'
In [28]: str[::-1]
Out[28]: '!klimJ si eman yM'

倒轉刪除元素

In [33]: str[:-2]
Out[33]: 'My name is Jmil'

刪除了倒數第1到第2個元素。

連線操作符

連線操作符' + ‘,可以將若干個同類型的序列物件連線到一起。

In [1]: str = 'My name is '
In [2]: name = 'Jmilk'
In [3]: str + name
Out[3]: 'My name is Jmilk'
In [4]: name = ['Jmilk']
In [5]: str + name
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-5-894081027c0a> in <module>()
----> 1 str + name
TypeError: cannot concatenate 'str' and 'list' objects

如果使用連線操作符處理兩個不同型別的序列,會出現型別錯誤。

重複運算子

重複運算子' * ‘,能夠讓被運算元重複的n次,並生成一個新的同類型序列。

In [16]: star = '*'
In [17]: star * 10
Out[17]: '**********'
In [18]: star = ['*','*']
In [19]: star * 10
Out[19]: 
['*','*','*']

成員關係符

成員運算子 in\not in 能夠判斷一個指定物件是否是作為一個容器中的元素,由此來判斷兩個物件間的關係。在Python運算子一篇中有詳細的介紹,傳送門:https://www.jb51.net/article/172479.htm

In [333]: li = [1,3]
In [334]: 1 in li
Out[334]: True
In [335]: 1 not in li
Out[335]: False

序列內建方法

注意:建議在學習一個方法之前,先使用help()函式來檢視方法的使用說明文件,其中引數型別可能為iterable迭代器。iterable迭代器分為下面3類:

1.所有的序列型別list、str、tuple。
2.非序列型別dict、file。
3.自定義的任何包含__iter__()或__getitem__()方法的類的物件。

即函式引數中包含iterable,表示可以傳遞迭代器型別實參。

len() 獲取序列物件的長度

序列物件的長度,即序列物件元素的個數

In [39]: name = 'Jmilk'
In [40]: len(name)
Out[40]: 5

zip 混合兩個序列物件

將兩個序列物件索引相同的兩個元素結合成元組,以較短的程度為準。

In [54]: str
Out[54]: ['my','name','is','Jmilk']
In [55]: name
Out[55]: 'Jmilk'
In [56]: zip(name,str)
Out[56]: [('J','my'),('m','name'),('i','is'),('l','Jmilk')]

enumerate() 枚舉出序列物件的元素

enumerate(sequence[,start = 0])接收一個序列型別的引數,返回由每一對索引號和元素組成的元組。可以指定索引的起始位置。

In [86]: for i,word in enumerate(name,2):
  print i,word
  ....:   
2 m
3 y
4 
5 n
6 a
7 m
8 e
9 
10 i
11 s
12 
13 j
14 m
15 i
16 l
17 k

sorted() 序列的排序

sorted(iterable,cmp=None,key=None,reverse=False) –> new sorted list

iterable:待排序的物件

cmp(x,y):指定一個定製的能夠比較兩個接收到的引數的函式,預設為None,即內建的比較函式。
key(x):指定一個接收一個引數的函式,用作在每個元素中提取一個關鍵值作為比較值,預設為None比較每個元素。
reverse:False為預設正序排列,True為逆序排列。

注意:沒有__getitem__屬性的物件,如:int型別是不能呼叫key和cmp函式的。
注意:在Python中有許多內建的函式需要指定一個定製的函式,如:map()、filter()、reduce()、包括sorted等,這種時候使用lambda匿名函式將會非常的方便。
排序效率:key 、reverse > cmp 。因為cmp函式進行多次的兩兩比較,而key、reverse對每個輸入記錄只會被呼叫一次。
Key函式:以第二個關鍵字為比較值排序

In [205]: li = [('a',3),('b',2),('c',1)]
In [208]: sorted(li,key = lambda keyword:keyword[1])
Out[208]: [('c',1),('a',3)]

cmp函式:以第二個關鍵字為比較值排序

In [213]: sorted(li,cmp = lambda x,y:cmp(x[1],y[1]))
Out[213]: [('c',3)]

reverse:逆序排列

In [216]: sorted(li,lambda z,x:cmp(z[1],x[1]),reverse=True)
Out[216]: [('a',1)]

reversed() 返回一個逆序訪問的迭代器

In [84]: for word in reversed(name):
  print word,....:   
k l i m j  s i  e m a n  y m

min() 取出sequence中的最小值

In [43]: min(str)
Out[43]: ' '
In [44]: min(li)
Out[44]: 1

若元素是String型別的化會轉換為ASCII碼計算後再比較。

max() 取出sequence中的最大值

類似min()方法。

sum() 計算序列中的各項元素和

注意:sum()方法不支援元素為String或Char型別的序列。

In [59]: num = [1,3,4]
In [60]: str = 'My name is Jmilk'
In [61]: sum(num)
Out[61]: 10
In [62]: sum(str)
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-62-3a5f0824550a> in <module>()
----> 1 sum(str)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

會觸發型別錯誤,不支援的運算數型別

all() 檢測sequence中各項元素是否均為True

全True則Truw

In [63]: num = [1,'']
In [64]: all(num)
Out[64]: False
In [65]: num = [1,True]
In [66]: all(num)
Out[66]: True

注意:所以的空值序列物件都是False

any() 檢測sequence中的任意項是否為True

有True則True

In [67]: num = [1,'']
In [68]: any(num)
Out[68]: True

字串String

讓Str支援Unicode

In [64]: name = u"My name is JMilk"
In [65]: name
Out[65]: u'My name is JMilk'

下面介紹適用於字串的內建方法。

capitalize() 將字串首字母變成大寫

In [88]: str = 'my name is jmilk'
In [89]: str.capitalize()
Out[89]: 'My name is jmilk'

lower()、upper() 將字串都使用小寫、大寫

In [90]: str.lower()
Out[90]: 'my name is jmilk'
In [91]: str.upper()
Out[91]: 'MY NAME IS JMILK'

title() 將字串中單詞的首字母變成大寫,其餘小寫

In [92]: str.title()
Out[92]: 'My Name Is Jmilk'

index() 找到substring對應的元組的索引號

S.index(sub [,start [,end]]) -> int 在start-end的範圍內找到substring對應的索引號,再返回一個int型別物件。

In [92]: str.title()
Out[92]: 'My Name Is Jmilk'
In [93]: str.title().index('J',13)
Out[93]: 11

當在指定範圍內沒有查詢到substring時,會觸發ValueError: substring not found的錯誤。同時可以看出,String型別物件呼叫了其內建方法後仍是String型別。

join() 將String插入到序列的元素之間

S.join(iterable) -> string 傳遞一個序列引數,會將String物件插入到序列的元素之間。即將序列的元素以String為分隔符連線起來,string物件可以為空。

In [103]: li = ['a','b','c']
In [104]: str
Out[104]: 'my name is jmilk'
In [105]: str.join(li)
Out[105]: 'amy name is jmilkbmy name is jmilkc'

replace() 替換String中的元素

S.replace(old,new[,count]) -> string

將String中的元素替換為指定的新元素,還可以指定替換的數量。

 In [113]: url = 'www.jmilk.com'
In [114]: url.replace('jmilk','fan')
Out[114]: 'www.fan.com'

split() 將string以指定的分隔符分裂成列表

S.split([sep [,maxsplit]]) -> list of strings

輸入指定的分割符和分割次數兩個引數。

In [117]: url.split('.',2)
Out[117]: ['www','jmilk','com']
In [118]: url = 'www.jmilk.com'
In [119]: url.split('.',2)
Out[119]: ['www','com']
In [120]: url.split('.',1)
Out[120]: ['www','jmilk.com']

strip() 修剪在String兩端的Char

S.strip([chars]) -> string or unicode

將String兩端的Chars去掉,並不能去掉String中間的subString

In [124]: url.strip('w')
Out[124]: '.jmilk.com'
In [125]: url.strip('m')
Out[125]: 'www.jmilk.co'
In [126]: url.strip('om')
Out[126]: 'www.jmilk.c'

最後

同樣是序列物件一份子的List型別,一樣有著非常多有意思的內建方法,我們下回再繼續學習。

更多關於Python相關內容可檢視本站專題:《Python列表(list)操作技巧總結》、《Python字串操作技巧彙總》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。