一、列表
Python在采用負數作為索引值時,是從-1開始的,而不是從0開始,即最后一個元素的下標為-1。
切片操作是訪問序列中元素的另一種方法,它可以訪問一定范圍內的元素。實現切片操作的語法格式:sname[start:end:step]。其中sname表示序列的名稱;start表示切片的開始位置(包括該位置),如果不指定,則默認為0;end表示切片的截止位置(不包括該位置),如果不指定則默認為序列的長度;step表示切片的步長,如果省略,則默認為1,當省略該步長時,最后一個冒號也可以省略。列表的切片並沒有破壞原有的列表,而是根據語法規則,建立了一個原有列表的部分副本。
len()函數計算序列的長度,max()函數返回序列中的最大值,min()函數返回序列中的最小值,list()函數將序列轉換成列表,str()將序列轉換成字符串,sum()計算元素和,sorted()對元素進行排序。
列表的基本操作
append(x):將x追加到列表尾部
extend(L):將列表L中所有的元素追加到列表的尾部
insert(index, x):在列表index位置處插入x,該位置后面的所有元素后移並且在列表中的索引加1,如果index為正數且大於列表長度則在列表尾部追加x,如果index為負數且小於列表長度的相反數則在列表頭部插入元素x
remove(x):在列表中刪除第一個值為x的元素,該元素之后所有元素前移並且索引減1,如果列表中不存在x則拋出異常
pop(index):刪除並返回列表中下標為index的元素,如果不指定index則默認為-1,彈出最后一個元素;如果彈出中間位置的元素則后面的元素索引減1;如果index不是[-L,L]區間上的整數則拋出異常
clear():清空列表,刪除列表中所有的元素,保留列表對象
index(x):返回列表中第一個值為x的元素的索引,若不存在值為x的元素則拋出異常
count(x):返回x在列表中出現的次數
reverse():對列表所有元素進行原地逆序,首位交換
sort(key=None, reverse=False):對列表中的元素進行原地排序,key用來指定排序規則,reverse為False表示升序,True表示降序
copy():返回列表的淺復制
列表對象提供了sort()方法用於對原列表中的元素進行排序,基本語法格式為:listname.sort(key=None, reverse=False),其中key表示指定一個從每個元素中提取一個用於比較的鍵,例如“key=str.lower”表示在排序時不區分字母大小寫;reverse為可選參數,如果指定其值為True,則表示降序排列,如果是False,則表示升序排列,默認為升序排列。
sorted()也可以用於排序,基本語法為sorted(iterable, key=None, reverse=False),其中iterable表示要進行排序的列表名稱。列表對象的sort()方法和內置sorted()函數的作用相同,不同的是使用sort()方法時,會改變原列表的排列順序,而使用sorted()函數時,會建立一個原列表的副本,該副本為排序后的列表。
(1)列表的添加:append()、insert()、entend()
append()用於向列表尾部追加一個元素,insert()用於向列表任意指定位置插入一個元素,extend()用於將另一個列表中的所有元素追加至當前列表的尾部。這3個方法都屬於原地操作,不影響列表對象在內存中的起始地址。
(2)列表的刪除:pop()、remove()、clear()
pop()用於刪除並返回指定位置(默認是最后一個)上的元素;remove()用於刪除列表中第一個值與指定值相等的元素;clear()用於清空列表中的所有元素。這3個方法也屬於原地操作。
random.shuffle(x):把列表x中的元素隨機亂序。
乘法運算符*可以用於列表和整數相乘,表示列表重復,返回新列表。運算符*=也可以用於列表元素重復,屬於原地操作。
enumerate()函數返回包含若干下標和值的迭代對象。
>>> a = ['a','b','c','d'] >>> enumerate(a) <enumerate object at 0x7ffc2e3af940> >>> list(enumerate(a)) [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
map()函數把函數映射到列表上的每個元素,filter()函數根據指定函數的返回值對列表元素進行過濾。
all()函數用來測試列表中是否所有元素都等價於True,any()用來測試列表中是否有等價於True的元素。
zip()函數將多列表元素進行重新組合。如果兩個列表不等長,以短的為准
>>> a = [1,2,3] >>> b = ['a','b','c'] >>> zip(a,b) <zip object at 0x7ffc2e3af040> >>> list(zip(a,b)) [(1, 'a'), (2, 'b'), (3, 'c')]
>>> c = [4,5,6] >>> d = ['e','f'] >>> list(zip(c,d)) [(4, 'e'), (5, 'f')]
列表推導式
a_list = [x*x for x in range(10)] 相當於 a_list = [] for x in range(10): a_list.append(x*x)
二、元組
列表和元組的區別:(1)列表屬於可變序列,它的元素可以隨時修改或者刪除;而元組屬於不可變序列,其中的元素不可以修改,除非整體替換。(2)列表可以使用append()、extend()、insert()、remove()和pop()等方法實現添加和修改列表元素;而元組則沒有這幾個方法,因為不能向元組中添加和修改元素,同樣也不能刪除元素。(3)列表可以使用切片訪問和修改列表中的元素;元組也支持切片,但是它只支持通過切片訪問元組中的元素,不支持修改。(4)列表不能作為字典的鍵,而元組則可以。
生成器推導式的用法與列表的推導式非常相似,在形式上生成器推導式使用圓括號作為定界符,而不是列表推導式所使用的方括號。
與列表推導式最大的不同是,生成器推導式的結果是一個生成器對象。生成器對象類似於迭代器對象,具有惰性求值的特點,只在需要時生成新元素,比列表推導式具有更高的效率,空間占用非常少,尤其適合大數據處理的場合。
使用生成器對象的元素時,可以根據需要將其轉化為列表或元組,也可以使用生成器對象的__next__()方法或者內置函數next()進行遍歷,或者直接使用for循環來遍歷其中的元素。但是不管使用哪種方法訪問其中的元素,只能從前往后正向訪問每個元素。當所有元素訪問結束以后,如果需要重新訪問其中的元素,必須重新創建該生成器對象。
使用生成器對象__next__()方法或內置函數next()進行遍歷
>>> g = ((i+2)**2 for i in range(10)) #創建生成器對象 >>> g <generator object <genexpr> at 0x7fcd9de095f0> >>> tuple(g) #將生成器對象轉換為元組 (4, 9, 16, 25, 36, 49, 64, 81, 100, 121) >>> list(g) #生成器對象已遍歷結束,沒有元素了 [] >>> g = ((i+2)**2 for i in range(10)) #重新創建生成器對象 >>> g.__next__() #使用生成器對象的__next__()方法獲取元素 4 >>> g.__next__() #獲取下一個元素 9 >>> next(g) #使用函數next()獲取生成器對象中的元素 16
使用for循環直接迭代生成器對象中的元素
>>> g = ((i+2)**2 for i in range(10)) >>> for item in g: #使用循環直接遍歷生成器對象中的元素 print(item, end=' ') 4 9 16 25 36 49 64 81 100 121
三、字典
通過映射函數創建字典,語法格式為:dictionary=dict(zip(list1,list2)),其中dictionary表示字典名稱;zip()函數用於將多個列表或元組對應位置的元素組合成元組;list1為一個列表,用於指定要生成字典的鍵;list2用於指定要生成字典的值。返回值,如果list1和list2的長度不同,則與最短的列表長度相同。
>>> name = ['姓名','年齡','學號'] >>> sige = ['xiaoming','21','6005'] >>> dictionary = dict(zip(name,sige)) >>> dictionary {'姓名': 'xiaoming', '年齡': '21', '學號': '6005'}
通過給定的“鍵值對”創建字典,語法格式為:dictionary=dict(key1=value1,key2=value2,…,keyn=valuen)。
>>> dictionary = dict(姓名='xiaoming',年齡=21,學號=6005) >>> dictionary {'姓名': 'xiaoming', '年齡': 21, '學號': 6005}
可以使用dict對象的fromkeys()方法創建值為空的字典,語法格式為:dictionary=dict.fromkeys(list1),其中list1為字典的鍵的列表。
>>> list = ['name','age','sex'] >>> dictionary = dict.fromkeys(list) >>> dictionary {'name': None, 'age': None, 'sex': None}
在Python中,訪問字典的元素可以通過下標的方式實現,與列表和元組不同,這里的下標不是索引號,而是鍵。
Python中推薦的方法是使用字典對象的get()方法獲取指定鍵所對應的值,語法格式為:dictionary.get(key,[default]),其中key為指定的鍵;default為可選項,用於指定當指定的鍵不存在時,返回一個默認值,如果省略,則返回None。
>>> a = {'name':'xiaoming','age':21,'sex':'man'} >>> a.get('name') 'xiaoming' >>> a.get('RNG','Uzi') 'Uzi'
使用字典對象的items()方法可以獲取字典的“鍵值對”列表,語法格式為:dictionary.items(),返回值為可遍歷的“鍵值對”的元組列表。想要獲取到具體的“鍵值對”,可以通過for循環遍歷該元組列表。
>>> a = {'name':'xiaoming','age':21,'sex':'man'} >>> a.items() dict_items([('name', 'xiaoming'), ('age', 21), ('sex', 'man')]) >>> for b in a.items(): print(b) ('name', 'xiaoming') ('age', 21) ('sex', 'man')
使用字典對象的items()方法可以返回字典的鍵、值對。使用字典對象的keys()方法可以返回字典的鍵。使用字典對象的values()方法可以返回字典的值。
問題解決:首先生成包含1000個隨機字符的字符串,然后統計每個字符的出現次數
>>> import string >>> import random >>> x = string.ascii_letters + string.digits + string.punctuation
#string.ascii_letters用來生成全部小寫字母和全部大寫字母
#string.digits用來生成0-9的數字
#string.punctuation用來生成特殊字符 >>> y = [random.choice(x) for i in range(1000)] #列表推導式生成1000個隨機字符 >>> z = ''.join(y) #將1000個隨機字符轉為字符串 >>> d = dict() #使用字典保存每個字符出現的次數 >>> for ch in z: d[ch] = d.get(ch, 0) + 1
當以指定鍵為下標為字典元素賦值時,有兩種含義:1)若該鍵存在,則表示修改該鍵對應的值;2)若不存在,則表示添加一個新的鍵:值對,也就是添加一個新元素。
可以用del dictionary[key]來刪除不需要的元素。
使用字典對象的update()方法可以將另一個字典的鍵:值一次性全部添加到當前字典對象,如果兩個字典中存在相同的鍵,則以另一個字典中的值為准對當前字典進行更新。
>>> a = {'age':37,'score':[98,97],'name':'xiao','sex':'male'} >>> a.update({'a':97,'age':39}) #修改age鍵的值,同時添加新元素'a':97 >>> a {'age': 39, 'score': [98, 97], 'name': 'xiao', 'sex': 'male', 'a': 97}
如果需要刪除字典中指定的元素,可以使用del命令。
>>> del a['age'] >>> a {'score': [98, 97], 'name': 'xiao', 'sex': 'male', 'a': 97}
也可以使用字典對象的pop()和popitem()方法彈出並刪除指定的元素。
>>> a.popitem() #彈出一個元素,對空字典會拋出異常 ('a', 97) >>> a.pop('sex') #彈出指定鍵對應的元素 'male' >>> a {'score': [98, 97], 'name': 'xiao'}
四、集合
在Python中可以直接使用{}創建set集合,語法格式為:setname={element 1,element2,……, element n}。也可以使用set()函數將列表、元組等其他可迭代對象轉換為集合,語法格式為:setname=set(iteration),其中iteration表示要轉換為集合的可迭代對象,可以是列表、元組、range對象等,也可以是字符串,如果是字符串,返回的集合將是包含全部不重復字符的集合。
使用集合對象的add()方法可以增加新元素,如果該元素已存在則忽略該操作,不會拋出異常;update()方法用於合並另外一個集合中的元素到當前集合中,並自動去除重復元素。
pop()方法用於隨機刪除並返回集合中的一個元素,如果集合為空則拋出異常;remove()方法用於刪除集合中的元素,如果指定元素不存在則拋出異常;discard()用於從集合中刪除一個特定元素,如果元素不在集合中則忽略該操作;clear()方法清空集合,刪除所有元素。
五、字符串
字符串的拼接可以直接使用“+”實現,但字符串不允許直接與其他類型的數據拼接。len()函數計算字符串的長度,在默認情況下,通過len()函數計算字符串的長度時,不區分英文、數字和漢字,所有字符都認為是一個。可以通過使用encode()方法進行編碼后再進行獲取。
切片方法可以截取字符串,語法格式為:string[start : end : step],其中string表示要截取的字符串;start表示要截取的第一個字符的索引,如果不指定,則默認為0;end表示要截取的最后一個字符的索引,不指定則默認為字符串的長度;step表示切片的步長。
字符串對象的split()方法可以實現字符串分割,也就是把一個字符串按照指定的分隔符切分為字符串列表,該列表的元素中,不包括分隔符,語法格式為:str.split(sep, maxsplit),其中str表示要進行分割的字符串;sep用來指定分隔符,默認為None,即所有空字符;maxsplit為可選參數,用於指定分割的次數。在split()方法中,如果不指定sep參數,那么也不能指定maxsplit參數。
>>> s = 'apple,peach,banana,pear' >>> s.split(',') ['apple', 'peach', 'banana', 'pear']
count()方法用來返回一個字符串在當前字符串中出現的次數。
find()方法用於檢索是否包含指定的子字符串,如果檢索的字符串不存在,則返回-1,否則返回首次出現該子字符串時的索引。rfind()用來查找一個字符串在另一個字符串指定范圍中最后一次出現的位置,如果不存在則返回-1。
>>> s = 'apple,peach,banana,peach,pear' >>> s.find('peach') 6 >>> s.find('peach',7) 19 >>> s.find('peach',7,20) -1 >>> s.rfind('p') 25
index()和rindex()方法用來返回一個字符串在另一個字符串指定范圍中首次和最后一次出現的位置,如果不存在則拋出異常。
字符串連接join()
>>> li = ['apple','peach','banana','pear'] >>> ','.join(li) 'apple,peach,banana,pear' >>> '.'.join(li) 'apple.peach.banana.pear' >>> '::'.join(li) 'apple::peach::banana::pear'
startswith()方法用於檢索字符串是否以指定子字符串開頭,如果是則返回True,否則返回False,語法格式為:str.startswith(prefix[,start[,end]]),其中prefix表示要檢索的子字符串。
endswith()方法用於檢索字符串是否以指定子字符串結尾,如果是返回True,否則返回False,語法格式為:str.endswith(suffix[,start[,end]]),其中suffix表示要檢索的子字符串。
lower()方法用於將字符串中的大寫字母轉換為小寫字母,語法格式為:str.lower()。
upper()方法用於將字符串中的小寫字母轉換為大寫字母,語法格式為:str.upper()。
capitalize()方法,字符串首字符大寫。
title()方法,每個單詞的首字母大寫。
swapcase()方法,大小寫互換。
查找替換replace(),類似於word中的“全部替換”功能。
>>> s = '中國,中國' >>> s '中國,中國' >>> s2 = s.replace('中國','中華人民共和國') >>> s2 '中華人民共和國,中華人民共和國'
strip()方法用於去掉字符串左、右兩側的空格和特殊字符,語法格式為:str.strip([chars]),其中str為要去掉空格的字符串;chars為可選參數,用於指定要去掉的字符,可以指定多個,如果不指定chars參數,默認將去除空格、制表符“\t”、回車符“\r”、換行符“\n”等。
lstrip()方法用於去掉字符串左側的空格和特殊字符,語法格式為:str.lstrip([chars])。
rstrip()方法用於去掉字符串右側的空格和特殊字符,語法格式為:str.rstrip([chars])。
六、正則表達式
行定位符用來描述子串的邊界。“^”表示行的開始;“$”表示行的結尾。如^tm表示要匹配子串tm的開始位置是行頭,如“tm equal Tomorrow Moon”就可以匹配,而“Tomorrow Moon equal tm”則不匹配。如果使用tm$,則后者可以匹配而前者不能匹配。如果要匹配的子串可以出現在字符串的任意部分,那么可以直接寫成tm。
常用的元字符:
.:匹配除換行符以外的任意字符
\w:匹配字母、數字、下划線或漢字
\W:匹配除字母、數字、下划線或漢字以外的字母
\s:匹配單個的空白符(包括<Tab>鍵和換行符)
\S:除單個空白字符以外的所有字符
\d:匹配數字
\b:匹配單詞的開始或結束,單詞的分界符通常是空格、標點符號或者換行
^:匹配字符串的開始
$:匹配字符串的結束
常用的限定符:
?:匹配前面的字符零次或一次(colou?r,該表達式可以匹配colour和color)
+:匹配前面的字符一次或多次(go+gle,該表達式可以匹配的范圍從gogle到goo…gle)
*:匹配前面的字符零次或多次(go*gle,該表達式可以匹配的范圍為ggle到goo…gle)
{n}:匹配前面的字符n次(go{2}gle,該表達式只匹配google)
{n,}:匹配前面的字符最少n次(go{2,},該表達式可以匹配的范圍從google到goo…gle)
{n,m}:匹配前面的字符最少n次,最多m次