列表是Python最常用的數(shù)據(jù)類型,是以一個(gè)方括號(hào)內(nèi)的逗號(hào)分隔值出現(xiàn)砰奕,列表內(nèi)的數(shù)據(jù)項(xiàng)不必相同播急。
如果我們收到一個(gè)"Give Me 5!“的字符串信息庇配。O(∩_∩)O.
s =?"Give Me 5!"
以下代碼會(huì)為我們生成一個(gè)與之相關(guān)的列表。
列表推導(dǎo)式? s1=[x for x in s] 生成?['G', 'i', 'v', 'e', ' ', 'M', 'e', ' ', '5', '!']? 從這我們可以看到列表內(nèi)的元素確實(shí)可以不同尊残。
列表推導(dǎo)式是從另外一個(gè)列表經(jīng)過處理生成新列表的方法炒瘸,這個(gè)方法由自己選用。
例1: s = [2017, 600776, 2592, 2811, 600775]
s1 = [str(x).zfill(6) for x in s] 生成 ['002017', '600776', '002592', '002811', '600775]
例2:s =?[1,2, 3, 4, 5],s1 = ['a','b','c','d','e']
s2 =[(x,y) for x,y in zip(s,s1)] 生成?[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]
例3: s = os.listdir(os.getcwd())
s1=[x for x in s if x.endswith(".ipynb") ] 生成?['thskp.ipynb', 'ths.ipynb', 'caa.ipynb']
這其實(shí)是當(dāng)前文件夾下文件類型是.ipynb的文件列表寝衫,是不是很有趣呢顷扩。
例4: s=['hoooyannn','luuuwooo']
s1 =?['163.com','qq.com']
s2 = [m+"@"+n for m in s for n in s1] 生成 ['hoooyannn@163.com', 'hoooyannn@qq.com', 'luuuwooo@163.com', 'luuuwooo@qq.com']
這里實(shí)際上是兩層循環(huán),生成了兩個(gè)列表列表項(xiàng)的組合慰毅,試試吧隘截。
例5:s1=??[1,2, 3, 4, 5]? ?s2=?[3, 4, 5,6,7]
s = [x for x in s1 if x not in s2]
這實(shí)際上是s1和s2的差集
例6:s1=??[1,2, 3, 4, 5]? ?s2=?[3, 4, 5,6,7]
s = [x for x in s1 if x in s2]
這實(shí)際上是s1和s2的交集
內(nèi)置函數(shù)str.split?s2 = s.split(" ") 生成?['Give', 'Me', '5!']? ?split()中的參數(shù)是分割的標(biāo)志,這里是以空格為分割。
內(nèi)置函數(shù)list() 可以把其它可迭代元素轉(zhuǎn)換成一個(gè)列表
假如我們有如下一個(gè)Series對(duì)象?s = pd.Series(data=['002017', '600776', '002592', '002811', '600775'],name='code')
0? ? 002017
1? ? 600776
2? ? 002592
3? ? 002811
4? ? 600775
Name: code, dtype: object
將它轉(zhuǎn)換為一個(gè)列表對(duì)象 s = list(s) 將生成?['002017', '600776', '002592', '002811', '600775']
可以用來轉(zhuǎn)換任何可迭代的對(duì)象婶芭,如元組东臀,字典,集合都是常見的可迭代對(duì)象犀农。
當(dāng)前也可以直接定義列表對(duì)象惰赋。 s =['I','Love','Python'] ,一對(duì)方括號(hào)內(nèi)定義逗號(hào)分隔的不同項(xiàng)呵哨,就是列表類型赁濒。
列表常用操作
append:
s= ['Give', 'Me', '5!']
s.append("Thanks!")
那么會(huì)得到 s=?['Give', 'Me', '5!', 'Thanks!']
insert:
s= ['Give', 'Me', '5!']
s.insert(0,"Please")
s.insert(-1,"best")
那么會(huì)得到 s=['Please', 'Give', 'Me', 'best', '5!']
remove:
s = ['hoooyannn@163.com', 'hoooyannn@qq.com', 'luuuwooo@163.com', 'luuuwooo@qq.com']
s2 = ['luuuwooo@163.com', 'luuuwooo@qq.com']
for x in s2:
? ? s.remove(s2)
那么會(huì)得到s =?['hoooyannn@163.com', 'hoooyannn@qq.com']
pop:
s= ['Give', 'Me', '5!']
m = s.pop()?
會(huì)得到 s=['Give', 'Me']? ? m=?'5!'
可利用該特性使用列表定義一個(gè)堆棧。
extend:
s1 = ['luuuwooo@163.com', 'luuuwooo@qq.com']
s2 =?['hoooyannn@163.com', 'hoooyannn@qq.com']
s1.extend(s2)
會(huì)得到 s1=['luuuwooo@163.com', 'luuuwooo@qq.com', 'hoooyannn@163.com', 'hoooyannn@qq.com']
s2不變孟害。
index:
s= ['Please','Give', 'Me', '5!']
m = s.index(‘Give')
會(huì)得到 m = 1 該列表中’Give'出現(xiàn)的位置索引拒炎。如果參數(shù)項(xiàng)在列表中不存在,會(huì)出現(xiàn)異常挨务,所以最好先用in,
not in枝冀,或者s.count('Give')先做判斷。
reverse:
s=['Enough','is','enough']
s.reverse()
得到s=['enough', 'is', 'Enough']
總結(jié)起來就是耘子,如果想刪除列表末尾項(xiàng)果漾,用pop,刪除指定項(xiàng),用remove谷誓,獲取指定項(xiàng)的索引用index绒障。
使插入的元素在列表末尾用append,指定插入元素的位置用insert捍歪,如果增加來自另外一個(gè)列表的
列表項(xiàng)用extend户辱。
改變現(xiàn)有列表可用reverse反轉(zhuǎn)。
列表擴(kuò)展
使用列表構(gòu)造一個(gè)堆棧糙臼,堆棧具有后進(jìn)先出(LIFO)的特征庐镐。
class Stack():
? ? """
? ? stack is a last in first out
? ? data structure
? ? """
? ? def __init__(self,size):
? ? ? ? """
? ? ? ? A stack is a last in first out
? ? ? ? data structure
? ? ? ? :type size:int
? ? ? ? """
? ? ? ? self.size = size
? ? ? ? self.stack=[]
? ? ? ? self.top=-1
? ? # Getter function
? ? @property
? ? def size(self):
? ? ? ? return self._size
? ? # Setter function
? ? @size.setter
? ? def size(self, value):
? ? ? ? if not isinstance(value, int):
? ? ? ? ? ? raise TypeError('Expected a int')
? ? ? ? if not value > 0:
? ? ? ? ? ? raise ValueError('Expected value bigger than zero')
? ? ? ? self._size= value
? ? # Deleter function
? ? @size.deleter
? ? def size(self):
? ? ? ? raise AttributeError("Can't delete attribute")
? ? def push(self,x):
? ? ? ? """
? ? ? ? push an object to stack
? ? ? ? the object is placed at the last position
? ? ? ? :type x: an object that is to be pushed to the stack
? ? ? ? """
? ? ? ? if self.isfull():
? ? ? ? ? ? raise Exception("the stack is full now")
? ? ? ? else:
? ? ? ? ? ? self.stack.append(x)
? ? def pop(self):
? ? ? ? """
? ? ? ? return the last pushed objected from stack
? ? ? ? and delete it from the stack
? ? ? ? """
? ? ? ? if self.isempty():
? ? ? ? ? ? raise KeyError("the stack is empty")
? ? ? ? else:
? ? ? ? ? ? self.top = self.top -1
? ? ? ? ? ? self.stack.pop()
? ? def peek(self):
? ? ? ? """
? ? ? ? return the item at the top of the stack
? ? ? ? raise keyerror if the stack is empty
? ? ? ? """
? ? ? ? if self.isempty():
? ? ? ? ? ? raise KeyError("the stack is empty")
? ? ? ? return self.stack[len(self.stack)-1]
? ? def isfull(self):
? ? ? ? """
? ? ? ? if the stack is full with object return True
? ? ? ? otherwise return False
? ? ? ? """
? ? ? ? return self.top +1 == self.size
? ? def isempty(self):
? ? ? ? """
? ? ? ? if no object in the stack return True
? ? ? ? otherwise return False
? ? ? ? """
? ? ? ? return self.top -1 == -1
? ? def show(self):
? ? ? ? """
? ? ? ? display the objects in stack
? ? ? ? """
? ? ? ? print (self.stack)
? ? def clear(self):
? ? ? ? """
? ? ? ? delete all objects from the stack
? ? ? ? """
? ? ? ? self.stack=[]
? ? ? ? self.top=-1
? ? def __iter__(self):
? ? ? ? """
? ? ? ? visit items from top to bottom of stack
? ? ? ? """
? ? ? ? length = len(self.stack)
? ? ? ? for i in range(length):
? ? ? ? ? ? yield self.stack[length-i-1]
在這里實(shí)現(xiàn)了固定大小的堆棧,并且在初始化時(shí)檢查參數(shù)類型变逃。
實(shí)驗(yàn)一下:
s = Stack(10)
for i in range(5):
? ? s.push(i)
s.show() 顯示?[0, 1, 2, 3, 4]
m = iter(s)
for i in range(len(s)):
? ? print(next(m))
列表和字符串的轉(zhuǎn)換:
l= ['Please','Give', 'Me', '5!']
s = " ".join(l)
這樣我們將列表還原成了字符串必逆,實(shí)際生成s="Please Give Me 5!"
列表的并集,差集揽乱,交集:
有如下兩個(gè)list:
listA=["apple","banana","pears","tomato"]
listB=["tomato","chilli"]
交集:
inte = list(set(listA).intersection(set(listB)))
并集:
uni = list(set(listA).union(set(listB)))
差集:
diff = list(set(listA).difference(set(listB)))