列表類型也是序列式的數(shù)據(jù)類型剩失。和字符串類型一樣,可以通過(guò)下標(biāo)或者切片操作來(lái)訪問(wèn)一個(gè)或者一段連續(xù)的元素册着。不同的是拴孤,字符串是不可變的,而列表具有可變?nèi)萜鞯奶匦约啄螅褂闷饋?lái)比較靈活演熟,列表容器的元素的數(shù)據(jù)類型可以是任意類型。
列表(list)
列表類型也是序列式的數(shù)據(jù)類型司顿。和字符串類型一樣芒粹,可以通過(guò)下標(biāo)或者切片操作來(lái)訪問(wèn)一個(gè)或者一段連續(xù)的元素。不同的是大溜,字符串是不可變的化漆,而列表具有可變?nèi)萜鞯奶匦裕斜砜梢蕴砑踊蛘邉h除元素猎提,此外列表類型的元素還可以是任意類型組合的获三。
列表的創(chuàng)建
創(chuàng)建一個(gè)列表比較簡(jiǎn)單旁蔼,和創(chuàng)建一個(gè)字符串是類似的,只不過(guò)列表是由([])來(lái)定義的疙教,元素類型可以是整形棺聊,浮點(diǎn)型,字符串贞谓,甚至還可以是列表限佩。
>>> aList = ['abc',123,4.56,['xyz',789,-28]]
>>> aList
['abc', 123, 4.56, ['xyz', 789, -28]]
列表的訪問(wèn)
列表的訪問(wèn)和字符串的訪問(wèn)方法是一樣的,都可以通過(guò)下標(biāo)或者切片操作來(lái)訪問(wèn)一個(gè)或者一段連續(xù)的數(shù)據(jù)元素裸弦。
>>> aList = ['abc',123,4.56,['xyz',789,-28]]
>>> aList[3]
['xyz', 789, -28]
>>> aList[0:3]
['abc', 123, 4.56]
>>> aList[3][2]
-28
列表的更新
與字符串不同的是祟同,列表具有可變性,所以理疙,列表可以更新某一元素的值晕城,還可以通過(guò)append()或者insert()方法來(lái)添加新的元素到列表中,同樣地窖贤,可以通過(guò)pop()或remove()方法刪除某一元素砖顷。
- list.append(x)方法是把一個(gè)元素添加到鏈表的結(jié)尾
- list.insert(index,x)方法是在指定位置插入一個(gè)元素
- list.remove(x)方法是刪除列表中值為x的元素
- list.pop([index])方法是刪除列表中索引為index的元素
代碼:
>>> aList = ['abc',123,4.56,['xyz',789,-28]]
>>> aList[0] = 'lmn'
>>> aList
['lmn', 123, 4.56, ['xyz', 789, -28]]
>>> aList.append('abc')
>>> aList
['lmn', 123, 4.56, ['xyz', 789, -28], 'abc']
>>> aList.remove('lmn')
>>> aList
[123, 4.56, ['xyz', 789, -28], 'abc']
>>> aList.pop(0)
123
>>> aList
[4.56, ['xyz', 789, -28], 'abc']
注意:pop()方法和remove()方法不同之處在于pop()方法是通過(guò)列表的索引進(jìn)行刪除元素并且返回刪除的元素值,而remove()是直接刪除一個(gè)元素值得赃梧。
列表類型操作符
因?yàn)榱斜硎菍儆谛蛄械囊活惵蓑穑孕蛄兄谐R?jiàn)的操作符(成員關(guān)系操作符(in 、not in)授嘀、連接操作符(+)物咳、重復(fù)操作符(*)、切片操作符([]蹄皱、[:]览闰、[::]))都適用于字符串。
列表解析
列表除了常見(jiàn)的序列類型的操作符之外夯接,列表?yè)碛兄粚儆谧约旱姆椒ā斜斫馕龌兰谩A斜斫馕鰜?lái)自于函數(shù)式編程Haskell纷妆。它是一種非常有用盔几、簡(jiǎn)單、而且靈活的工具掩幢,可以用來(lái)動(dòng)態(tài)地創(chuàng)建列表逊拍。
因?yàn)镻ython支持函數(shù)式編程特性,所以類似map()际邻、filter()芯丧、reduce()之類的方法可以通過(guò)列表解析,簡(jiǎn)化成一個(gè)列表解析式子世曾。
列表解析的語(yǔ)法:
[expr for iter_var in iterable]
該語(yǔ)法的核心在于for循環(huán)缨恒,它迭代iterable對(duì)象的所有條目,expr應(yīng)用于序列的每個(gè)成員,最后的結(jié)果值應(yīng)該是該表達(dá)式產(chǎn)生的列表骗露。
# 求0-9的平方和
>>> [x ** 2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
此外岭佳,還有一個(gè)類似的拓展版本較為常用 [expr for iter_var in iterable if cond_expr]
# 求0-9的平方和為偶數(shù)的數(shù)值
>>> [x ** 2 for x in range(10) if x % 2 == 0]
[0, 4, 16, 36, 64]
常用函數(shù)式編程工具
- filter(function,sequence)方法是返回一個(gè)sequence(序列),包括了給定序列中所有調(diào)用function(item)后返回值為true的元素萧锉。
代碼:
>>> def div_3_or_div_5(x):
return x % 3 == 0 or x % 5 == 0
>>> filter(div_3_or_div_5,range(0,21))
[0, 3, 5, 6, 9, 10, 12, 15, 18, 20]
- map(function,sequence)方法是為每一個(gè)元素調(diào)用function(item)并將返回值組成一個(gè)新的列表返回珊随。
代碼:
>>> def cube(x):
return x * x * x
>>> map(cube,range(0,4))
[0, 1, 8, 27]
- reduce(function,sequence)方法是返回一個(gè)單值,他的構(gòu)造方法是:首先以序列的前兩個(gè)元素調(diào)用函數(shù)function柿隙,再以返回值和第三個(gè)參數(shù)調(diào)用叶洞,依次下去。
代碼:
>>> def sum(seq):
def add(x, y):
return x + y
return reduce(add, seq, 0)
>>> sum(range(1,101))
5050
內(nèi)建函數(shù)
對(duì)于cmp()禀崖、len()衩辟、max()、min()波附、enumerate()以及zip()方法和字符串中的使用相同惭婿,在這里就不做具體說(shuō)明了。
序列類型函數(shù)
sorted()方法可以實(shí)現(xiàn)以ASCII碼值大小來(lái)排序列表中的成員叶雹。
>>> aList = ['cool','is','Python']
>>> sorted(aList)
['Python', 'cool', 'is']
reversed()方法可以實(shí)現(xiàn)列表的反轉(zhuǎn)财饥。
>>> aList = ['cool','is','Python']
>>> for x in reversed(alist):
print x,
Python is cool
列表類型的內(nèi)建函數(shù)
- list.append(x)方法是把一個(gè)元素添加到鏈表的結(jié)尾
- list.insert(index,x)方法是在指定位置插入一個(gè)元素
- list.remove(x)方法是刪除列表中值為x的元素
- list.pop([index])方法是刪除列表中索引為index的元素
- list.count(obj)返回一個(gè)對(duì)象在列表中出現(xiàn)的次數(shù)
- list.extend(seq)把序列seq的內(nèi)容添加到列表中
- list.reverse()原地反轉(zhuǎn)列表
- list.sort(func=None,key=None,reverse=False)以指定的方式排序列表中的成員,如果func和key參數(shù)指定折晦,則按照指定的方式比較各個(gè)元素钥星,如果reverse標(biāo)志置為True,則列表以反序排列满着。
列表的特殊特性
因?yàn)榱斜硎怯腥萜骱涂勺兊奶匦郧矗晕覀兘?jīng)常用它來(lái)創(chuàng)建Python數(shù)據(jù)結(jié)構(gòu)中的堆棧和隊(duì)列。
堆棧的實(shí)現(xiàn)
堆棧的實(shí)現(xiàn)方式主要為“先進(jìn)后出”风喇,類似于我們清洗飯后的碗碟宁改。
源代碼:
class Stack():
def __init__(self,size):
self.list = []
self.size = size
self.top = -1
def _Full(self):
if self.top == self.size - 1:
return True
else:
return False
def _Empty(self):
if self.top == -1:
return True
else:
return False
def instack(self,_list):
if self._Full():
print 'The stack is Full.'
else:
self.list.append(_list)
self.top = self.top + 1
def outstack(self):
if self._Empty():
print 'The stack is empty.!'
else:
self.list.pop()
self.top = self.top - 1
# test
s = Stack(10)
print s._Full()
print s._Empty()
for i in range(10):
s.instack(i)
print s._Full()
for i in range(10):
s.outstack()
print s._Empty()
隊(duì)列的實(shí)現(xiàn)
隊(duì)列的實(shí)現(xiàn)方式主要為“先進(jìn)先出”,類似于我們生活中排隊(duì)魂莫。
源代碼:
class Queue():
def __init__(self,size):
self.list = []
self.size = size
self.front = -1
self.rear = -1
def _Empty(self):
if self.front == self.rear:
return True
else:
return False
def _Full(self):
if self.rear - self.front + 1 == self.size:
return True
else:
return False
def inqueue(self,_list):
if self._Full():
print 'The Queue is full.'
else:
self.list.append(_list)
self.rear = self.rear + 1
def outqueue(self):
if self._Empty():
print 'The Queue is empty.'
else:
self.list.pop()
self.front = self.front + 1
#test
q = Queue(10)
print q._Empty()
print q._Full()
for i in range(10):
q.inqueue(i)
print q._Full()
for i in range(10):
q.outqueue()
print q._Empty()
堆棧和隊(duì)列的容器均之所以選擇列表list还蹲,而不選擇元組tuple,主要是因?yàn)榱斜砭哂锌梢赃M(jìn)行動(dòng)態(tài)修改,元組不允許修改耙考。