數(shù)據(jù)結(jié)構(gòu)是通過某種方式(如對元素進行編號)組織在一起的數(shù)據(jù)元素的集合,這些元素可以是數(shù)字或字符。在Python中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列(Sequence)。Python包含6種內(nèi)建序列,即列表、元組、字符串、Unicode字符串、buffer對象和xrange對象。這里只說到最常用的兩種,即列表和元組。
1. 通用操作
Python中所有序列都可以進行一些特定操作,包括索引(indexing)、切片(slicing)、序列相加(adding)、乘法(multiplying)、成員資格、長度、最小值和最大值。
索引和切片
在列表后面用 [] 加上數(shù)字就可以進行索引了。在索引里面用冒號 : 就可以切片了。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[1] #這就是索引,用下標(biāo)指向列表里面的元素。
2
>>> a[0] #注意索引從0開始.
1
>>> a[1:3] #Python的切片功能非常強大,只用一個冒號就可以完成各種切片.
[2, 3]
>>> a[:] #如果冒號前后沒有數(shù)字,分別默認為第一個元素和最后一個元素
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[:-1] #索引還可以是負號, 其中-1代表最后一個元素.
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:-1] #注意 a[0:-1]和a[:-1]是一樣的, 但是a[0:-1] 和a[0:] 不一樣,請思考是為什么
[1, 2, 3, 4, 5, 6, 7, 8, 9]
切片操作的實現(xiàn)需要提供兩個索引作為邊界,第一個索引的元素包含在切片內(nèi),第二個索引的元素不包含在分片內(nèi)。類似于數(shù)學(xué)里的a≤x<b,x是我們需要得到的元素,a是分片操作中的第一個索引,b是第二個索引,b不包含在x的范圍內(nèi)。
另外,切片里面還有一個默認參數(shù),就是步長。默認情況下,步長為1,需要的時候,可以自定義。
>>> a[0:11:2] #第二個冒號后面就是步長, 如果不寫的話默認是1, 現(xiàn)在我設(shè)定步長為2.
[1, 3, 5, 7, 9]
>>> a[11:3:-2] #步長也可以設(shè)置為負數(shù), 對應(yīng)的前面的切邊也要倒過來,大的序號寫在前面, 小的序號寫在后面.
[10, 8, 6]
對于正數(shù)步長,Python會從序列的頭部開始向右提取元素,直到最后一個元素;對于負數(shù)步長,則是從序列的尾部開始向左提取元素,直到第一個元素。正數(shù)步長必須讓開始點小于結(jié)束點,而負數(shù)步長必須讓開始點大于結(jié)束點。
序列的加法和乘法就不多說了,和字符串的加法乘法是類似的。
成員資格
Python為我們提供了in運算符,用來檢查某個元素是否存在于某個序列。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 1 in a
True
>>> 0 in a
False
>>>
注意in是一個運算符,運算符左邊是元素,右邊是列表,這就構(gòu)成了一個判斷語句,最終語句的結(jié)果是True或者False。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 1 in a
True
>>> 0 in a
False
>>> 'a' in a
False
>>> b = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
>>> 'a' in b
False
>>> 1 in b #數(shù)字可以用in語句檢查是否存在字符串列表中。
False
>>> c = '123456789'
>>> 'a' in c
False
>>> 1 in c #但是數(shù)字不能用in語句檢查是否存在字符串中。
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
1 in c
TypeError: 'in <string>' requires string as left operand, not int
長度、最小值和最大值
Python提供了三個內(nèi)置函數(shù)len(), min(), max(),分別用于計算列表的長度,給出列表的最小值,給出列表的最大值。
用法非常簡單,沒什么好說的。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> len(a)
10
>>> min(a)
1
>>> max(a)
10
>>> b = [1, 2,'hello', 10]
>>> len(b)
4
>>> min(b)
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
min(b)
TypeError: '<' not supported between instances of 'str' and 'int'
>>>
然而請注意混合型的列表不能用min() 和max(),否則會出現(xiàn)類型錯誤。
2. 列表操作
列表的內(nèi)容是可變的(mutable),這一點和字符串、元組不同。所以列表除了序列的通用操作,如索引、分片、相加、乘法之外,還有一些序列中沒有而列表中有的方法。
這些方法的作用都是更新列表,有元素賦值、元素增加、元素刪除、分片賦值和列表方法。
元素賦值
列表可以通過索引對元素進行賦值,而不可變的序列比如字符串和元組都不能進行這種操作。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[1]=100
>>> a
[1, 100, 3, 4, 5, 6, 7, 8, 9, 10] #我們改變了索引為1的元素。
>>> b=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> b[1] = 100
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
b[1] = 100
TypeError: 'tuple' object does not support item assignment #Python不允許對元組的元素賦值。
>>> c = '123456789'
>>> c[1]='100'
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
c[1]='100'
TypeError: 'str' object does not support item assignment #Python不允許對字符串的元素賦值。