(一)、主要內(nèi)容
- 1.1、列表
- 1.2、元祖
- 1.3、字典
-
1.4、集合
列表 、字典、元祖、集合
(二)、列表
2.1、Python 提供了列表數(shù)據(jù)類型來存儲由多個值組成的序列。在列表中,只可以是任何類型,稱為元素或項。Python 列表是有序的。任意的成員都可以通過下標(biāo)來進(jìn)行訪問。話句話說,Python 對列表數(shù)據(jù)中的所有成員按序編號,稱為索引,從而實現(xiàn)對成員變量的訪問和修改。
-
2.2、列表的創(chuàng)建
-
用逗號分隔的不同的數(shù)據(jù)項使用方括號“[ ]”括起來即可創(chuàng)建列表。例如:
>>> list1 = ["a","b","c","d"] >>> list2 = [1,2,3,4] >>> list3 = ['one','two','three','four']
-
列表允許嵌套,也就是說列表中的成員同樣可以是列表,例如:
>>> list4 = [1,'str',['name','goodbye']] >>> list5 = [] #定義一個空的 list
-
-
2.3、列表的基本操作
下面以
list1 = ['one','two','three','four']
和list2 = ['1','2','3','4']
為例展示列表的基本操作列表的基本操作 列表的基本操作 操作 含義 list1[i] 索引(求列表list1位置索引為 i
的元素)list1[i:j:k] 切片求list1的位置索引為 i~j~k
的子列表list1 + list2 將 list1與list2連接 list1 * 2 或者 2*list 將 list復(fù)制2次 len(list1) 求list1的長度 for <var> in list 對list 元素循環(huán) <expr> in list1 查找 list 是否存在<expr>,返回的值為布爾類型 del list1 刪除列表 del list[2] 刪除列表中位置索引為i的元素 max(list1) 返回列表中最大的值 min(list1) 返回列表中最小的值 -
使用舉例:
-
列表切片的形式為
list1[i:j:k]
,其中 i 為 起始位置索引(包含i),默認(rèn)為0;j為終止位置索引(不會包含j),默認(rèn)為序列尾;k為切片間隔,默認(rèn)為1,i,j,k的默認(rèn)值均可省略,只保留冒號。>>> list = [1,2,3,3,4,5,6,7,8] >>> print(list[1:5]) # 取區(qū)間 左開右閉 [2, 3, 4, 5] >>> print(list[:5]) # 可以省略第1位 [1, 2, 3, 4, 5] >>> print(list[3:]) # 可以省略第2位 取值到最后 [4, 5, 6, 7] >>> print(list[2:-1]) # 從前是從0~n-1開始,后面是從-1~-n [3, 4, 5, 6] >>> print(list[:]) #從頭取到尾 [1, 2, 3, 4, 5, 6, 7] >>> print(list[::2]) # 步長為 2 [1, 3, 5, 7] >>> print(list[0:3:2]) [1, 3] >>> print(list[7:1:-2]) # 注意步長為負(fù)值,就從7到1倒敘,步長為 2 [7, 5, 3]
注意:列表與字符串的重要區(qū)別是:列表中的元素可以被更改,因此可以使用賦值語句改變列表中任意元素的值。例如:
>>> list = [1,2,3,4,5,6] >>> list[3] 4 >>> list[3] = "JK" >>> print(list) [1, 2, 3, 'JK', 5, 6] >>> list[1:3] = ["A","B"] >>> print(list) [1, 'A', 'B', 'JK', 5, 6]
從上面可以看出Python列表是非常靈活的,上面還展示了利用切片一次性修改了列表中的一連串元素。
-
-
使用運算符“*”和“+”可分別對列表中的元素進(jìn)行復(fù)制或拼接,例如:
>>> list = [0]*6 >>> print(list) [1, 1, 1, 1, 1, 1] >>> print(2*['a']+['c']*3) ['a', 'a', 'c', 'c', 'c']
-
-
2.4、更多列表操作
-
list.append(x)
: 在列表的末尾添加元素x,等價于a(len(a):) = [x]
。 -
list.extend(L)
: 在列表末尾加入指定列表L中所有的元素,等價于a[len(a):] = L
或a+L
: 把一個列表合并到另外一個列表里面 -
list.insert(i,X)
: 在給定的位置添加元素,也就是在位置i插入x,其余元素依次向后退。 -
list.remove(x)
: 移除列表中值為 x 的元素,如果沒有x就會報錯。 -
list.pop([i])
:刪除列表中指定位置i的元素,并返回該元素。若不指定索引值(list.pop
),則移除并返回列表中的最后一個元素。 -
list.clear()
: 刪除列表中所有的元素,等價于:del a[:]
-
list.index(x)
:返回列表中值為x的位置索引,若不存在就會出錯。 -
list.count(x)
:返回x在列表中出現(xiàn)的次數(shù)。 -
list.sort(key=None,reverse=False)
:對列表中的元素排序,默認(rèn)為升序。 -
list.reverse()
:將列表中的元素順序反轉(zhuǎn)。 -
list.copy()
: 返回列表的淺復(fù)制(返回的也是列表),等價于a[:]
- 注意:上面的
insert()
,list.remove()
,sort()
方法僅僅是修改列表而不返回修改的結(jié)果,即返回值為默認(rèn)的值None
。
-
-
2.5、刪除列表中的元素
- Python提供的del操作可以通過元素的位置索引將其從列表中刪除。注意:del不是一個列表對象的操作方法,而是可用于列表元素的Python內(nèi)置操作命令。del與pop()不同,pop()會返回被刪除的元素。此外,del還可以刪除子列表或整個列表變量。
>>> a = [-1,1,44.5,456,90,5,9] >>> del a[0] [1,44.5,456,90,5,9] >>> del a[2:4] [1, 44.5, 5, 9] >>> del a[:] []
注意:
del a
將會刪除整個列表變量。刪除后,若想訪問該變量,將會出現(xiàn)錯誤。 -
2.6、列表解析
列表解析也稱為“列表推導(dǎo)式”或“列表的內(nèi)涵”是Python語言有力的語法之一。常用語從集合對象中有選擇地獲取并計算元素。雖然在多數(shù)情況下可以使用for、if等語句組和完成同樣的任務(wù),但列表解析書寫的代碼更簡潔。例如:>>> squares = [] >>> for x in range(10): squares.append(x**2) >>> print(squares) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
列表解析實現(xiàn)上面的功能如下:
>>> squares = [x**2 for x in range(10)] >>> print(squares) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
(三)、元組
元組(tuple)是Python中一種內(nèi)置的存儲有序數(shù)據(jù)的結(jié)構(gòu)。與列表類似,可以存儲不同類型的數(shù)據(jù)。但是元組是不可以改變的,創(chuàng)建后不能再做任何的修改。元組的主要作用是作為參數(shù)傳遞給函數(shù)調(diào)用或者從函數(shù)調(diào)用那里獲得參數(shù)時,保護其內(nèi)容不被外部接口修改。
-
3.1、創(chuàng)建元組 : 如果用逗號分割一些值,那么將自動創(chuàng)建元組,元組通常用圓括號()括起來,換句話說,如果以逗號隔開,則默認(rèn)為元組。如下:
>>> 4,5,6 (4, 5, 6) >>> t = "a","b","c","d" # 元組打包(tuple packing) >>> t ('a', 'b', 'c', 'd')
元組允許嵌套
>>> t = "a","b","c","d" # 元組打包(tuple packing) >>> u = t,(1,2,3,4,5) # 元組允許嵌套 >>> u (('a', 'b', 'c', 'd'), (1, 2, 3, 4, 5))
一個值元組必須加個逗號,例如:
>>> 43, (43,) >>> tuple = 'hello', # 加逗號后,tuple實際上是包含一個元素'hello'的元組 >>> len(tuple) 1 >>> tuple >>> ('hello',)
-
3.2、元組的基本操作 :
元組的基本操作與列表類似
元組的基本操作 元組的基本操作 操作 含義 tup[i] 求索引為i的元素 tup[i:j:k] 切片求tup的位置索引為 i~j~k
的子元組tup1 + tup2 將 tup1與tup2連接 tup * 2 或者 2* tup 將 tup復(fù)制2次 len(tup) 求tup的長度 for <var> in tup 對tup 元素循環(huán) <expr> in tup 查找 tup 是否存在<expr>,返回的值為布爾類型 del tup 刪除元組 max(tup) 返回元組中最大的值 min(tup) 返回元組中最小的值 由于元組不能修改:
- 不能向元組增加元素,元組沒有append或extend方法
- 不能從元組刪除元素,元組沒有remove或pop方法
- 不能在元祖中查找元素,元組沒有index方法
-
3.3、元組與列表的相互轉(zhuǎn)換
-
元組與列表可以相互轉(zhuǎn)換,Python 內(nèi)置的
tuple()
函數(shù)接收一個列表,可返回一個包含相同元素的元組。而 list() 函數(shù)接收一個元組返回一個列表。從元組與列表的性質(zhì)來看,tuple()相當(dāng)于凍結(jié)一個列表,而list()相當(dāng)于凍結(jié)一個元組。例如:>>> list1 = [1,2,3] >>> tuple1 = tuple(list1) >>> print(tuple1) (1, 2, 3) >>> list2 = list(tuple1) >>> print(list2) [1, 2, 3]
-
分別從兩個列表中取不相同的兩個元素組合成元組類型元素的新列表。
>>> [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
-
-
3.4、元組解包
-
聲明
a = "a","b","c","d"
被稱為元組打包。其實也可以進(jìn)行反向操作:元組解包,即將等號右側(cè)的元素按順序依次賦給等號左邊的變量。例如:>>> t = (1,2,3) >>> a,b,c = t >>> a 1 >>> b 2 >>> c 3
- 元組相對于列表的優(yōu)勢:首先比列表的運算速度快,如果定義了一個常量集對象,并且需要在程序中不斷地遍歷它,則建議使用元組而不是列表。其次,使用元組相當(dāng)于為不需要修改的數(shù)據(jù)進(jìn)行了“寫保護” ,使得數(shù)據(jù)更安全。
-
(四)、字典
Python語言的字典就是一種映射。
-
4.1、創(chuàng)建字典
-
字典包含了一個索引的集合,稱為鍵和值的集合。一一對應(yīng),這種關(guān)系稱為鍵值對或稱為項。簡單地說,字典就是用花括號包裹的鍵值對的集合。每個鍵值對用冒號
“:”
分割,每對之間用逗號“,”
分割,格式如下:dict1 = {'key1':'1','key2':'2'} dict2 = {} # 創(chuàng)建空字典
鍵必須是唯一的,不能重復(fù),還必須是不可變的數(shù)據(jù)類型,例如:字符串、數(shù)字、或元組。值可以是任何數(shù)據(jù)類型。
-
可以通過dict(構(gòu)造器)來創(chuàng)建字典,構(gòu)造器的入?yún)榱斜?或元組),列表(或元組)內(nèi)部是一系列包含兩個值的列表或元組。例如:下面語句的入?yún)榱斜恚斜韮?nèi)部為元組。
>>> dict([('sape',3429),('guido',2890),('jack','190)]) {'sape': 3429, 'guido': 2890, 'jack': 190}
-
可以通過關(guān)鍵字的形式創(chuàng)建字典,但鍵只能為字符串型,并且字符串不用加引號,例如:
>>> dict(name= 'JK',age= '40') {'name': 'JK', 'age': '40'}
-
-
4.2、訪問字典中的值
-
根據(jù)鍵取值:如果鍵不存在就會引發(fā)
KeyError
>>> dict = {'name':'jack','age':'20'} >>> print(dict['name']) jack
-
檢查字典中是否含有鍵key,可以使用
in
:>>> d = ['name','alice'] >>> 'name' in d True
-
-
4.3、更新字典
-
可以添加、刪除、更新字典中的一個鍵值對,例如:
>>> dict = {'a':1,'b':2,'c':3} >>> dict['d'] = 4 # 添加新鍵值對 >>> dict {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> dict['a'] = 5 # 更新鍵 a 的值 >>> dict {'a': 5, 'b': 2, 'c': 3, 'd': 4} >>> del dict['a'] # 刪除鍵值對 {'a': 5} >>> dict {'b': 2, 'c': 3, 'd': 4}
-
-
4.4、字典的操作
- 字典提供了一些內(nèi)置方法來訪問、添加、刪除其中的鍵、值或鍵值對。方法如下:
字典對象的方法 含義 dict.keys() 返回包含字典所有key的列表 dict.values 返回包含字典所有.value的列表 dict.items() 返回包含所有(鍵,值)項的列表 dict.clear() 刪除字典中所有的項或元素,無返回值 dict.copy() 返回字典淺復(fù)制副本 dict.get(key,default=None) 返回字典中key對應(yīng)的值,若key不存在,則返回default的值(default默認(rèn)為None) dict.pop(key[,default]) 若字典中存在key,則刪除并返回key對應(yīng)的value;如果key不存在,且沒有給出default值,則引發(fā)KeyRrror異常 dict.setdefault(key,default=None) 若字典中不存在key,則由dict[key]=default為其賦值 dict.update(dict2) 將字典dict2中的鍵值對添加到字典dict中 -
返回字典所有的鍵、值和項
dict.keys()
、dict.values()
、dict.items()
這三個方法分別返回包含字典中每項的鍵、值和項(鍵,值)的列表,例如:>>> dict={'a':'1','b':'2','c':'3','d':'4'} >>> dict.keys() dict_keys(['a', 'b', 'c', 'd']) >>> dict.items() dict_items([('a', '1'), ('b', '2'), ('c', '3'), ('d', '4')]) >>> dict.values() dict_values(['1', '2', '3', '4'])
要遍歷一個字典,只需要遍歷它的鍵即可
dict = {'a': '1', 'b': '2', 'c': '3', 'd': '4'} for key in dict: print('key = %s value = %s' % (key,dict[key])) key = a value = 1 key = b value = 2 key = c value = 3 key = d value = 4
-
字典清空
用dict.clear()可清空原始字典中所有的元素。有趣的是,對于兩個相關(guān)聯(lián)的字典對象x,y,若將x賦值為空子典,將不對y產(chǎn)生影響;而用clear方法清空x,也將清空字典y中所有的元素。例如:-
賦值為空子典
>>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key':'value'} >>> x = {} >>> y {'key':'value'}
-
clear方法清空
>>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key':'value'} >>> x.clear() >>> y {}
-
-
字典的淺復(fù)制
dict.copy()方法返回一個具有相同鍵值對的新字典。但在原始字典中,如果修改了某個值,副本字典也會被修改,故稱為淺復(fù)制,僅僅復(fù)制字典對象直接包含的引用,不復(fù)制嵌套的對象。如果要避免該問題,可以使用深復(fù)制(不僅僅復(fù)制字典對象,還要復(fù)制這個字典對象所引用的對象)方法:dict.deepcopy()。例如:copy 淺復(fù)制 復(fù)制時只會復(fù)制父對象,而不會復(fù)制對象的內(nèi)部的子對象。
-
deepcopy 深復(fù)制 復(fù)制對象及其子對象
>>> dict = {'a': '1', 'b': '2', 'c': '3'} >>> y = dict.copy() >>> z = dict.deepcopy() >>> print(y) {'a': '1', 'b': '2', 'c': '3'} >>> print(z) {'a': '1', 'b': '2', 'c': '3'}
-
用鍵查值
dict.get(key, default=None)
:返回指定鍵的值,如果值不在字典中返回None值。還可以自定義默認(rèn)值,替換None值。例如:>>> dict = {} >>> print(dict.get('name')) None >>> dict['name'] = "JK" >>> print(dict.get('name')) JK
-
移除鍵值對
pop(key[,default])
:方法用來獲得并返回對應(yīng)給定鍵的值,然后將這個鍵值對從字典中移除。例如:>>> dict = {'a': '1', 'b': '2', 'c': '3'} >>> print(dict.pop('a')) 1 >>> print(dict) {'b': '2', 'c': '3'}
-
字典更新
dict.update(dict2)
:把字典dict2的鍵/值對更新到dict里。也就是把一個字典合并到另外一個字典里面,若有相同的鍵則會進(jìn)行覆蓋。>>> dict1= {'a': '1', 'b': '2', 'c': '3'} >>> dict2= {'c': '10','d':'11'} >>> dict1.update(dict2) >>> print(dict1) {'a': '1', 'b': '2', 'c': '10', 'd': '11'}
-
Python沒有專門的枚舉分支結(jié)構(gòu),但利用字典可以實現(xiàn)枚舉的功能,例如:輸入兩個數(shù)字,并輸入加減乘除運算符號,輸出運算的結(jié)果。若輸入其他符號,則退出程序。如下:
while True: a = float(input('請輸入第一個數(shù)字:')) b = float(input('請輸入第二個數(shù)字:')) t = input('請輸入運算符號,其他符號為退出程序:') tup = ('+','-','*','/') if t not in tup: break dict = {'+':a+b,'-':a-b,'*':a*b,'/':a/b} print('%s %s %s = %0.1f' % (a,t,b,dict.get(t))) # 下面是我的輸入 請輸入第一個數(shù)字:3 請輸入第二個數(shù)字:4 請輸入運算符號,其他符號為退出程序:* 3.0 * 4.0 = 12.0
(五)、集合
集合(set)是不重復(fù)元素的無序集,它兼具了列表和字典的一些性質(zhì)。集合類似字典的特點:用花括號“{}”來定義,其元素是非序列類型的數(shù)據(jù),也就是沒有序列,并且集合中的元素不可重復(fù),也必須是不變對象,類似于字典中的鍵。集合的內(nèi)部結(jié)構(gòu)與字典很相似,區(qū)別是“只有鍵沒有值”。另一方面,集合也具有一些列表的特點:持有一系列元素,并且可原處修改。由于集合是無序的,不記錄元素位置或者插入點,因此不支持索引、切片或其他類序列的操作。
-
5.1、集合的創(chuàng)建
-
直接用“{}”創(chuàng)建,例如:
>>> s1 = {1,2,3,4} >>> s1 {1, 2, 3, 4} >>> s2 = set() # 注意創(chuàng)建空集合要用 set() 而非{},若用{},將創(chuàng)建空子典 >>> s2 set() >>> type(s2) <class 'set'> >>> s3 = {} >>> type(s3) <class 'dict'>
說明:集合通過 “{}” 無法創(chuàng)建含有列表或字典元素的集合。含有元組的集合可以創(chuàng)建。
-
由字符串創(chuàng)建:用函數(shù) set(str) 將str中的字符拆開以形成集合。例如:里面重復(fù)的字符要只保留一個字符。
>>> s1 = set('helloPython') >>> s1 {'h', 'e', 'l', 'n', 'y', 'o', 'P', 't'}
-
由列表或元組創(chuàng)建:用函數(shù)set(seq)創(chuàng)建集合,參數(shù)可以是列表或元組。在下面例子中,調(diào)用set()并傳入 list,將list 的元素作為集合的元素:例如:
>>> s1 = set([1,'name',2,'age','hobby']) >>> s1 {1, 2, 'hobby', 'age', 'name'} >>> s2 = set((1,2,3)) {1, 2, 3}
由于集合內(nèi)部存儲的元素是無序的,因此輸出順序和原列表的順序有可能是不同的。
-
-
5.2、集合的修改
修改集合的方法 含義 set.add(x) 向集合中添加元素 x set.update(a_set) 使用集合 a_set 更新原集合(合并set和a_set) set.pop() 刪除并返回集合中的任意元素 set.remove(x) 刪除集合中的元素x,如果x不存在則報錯 set.discard(x) 刪除集合中的元素x,如果x不存在則什么也不做 set.clear() 清空集合中的所有元素 -
5.3、集合的數(shù)學(xué)運算
集合支持聯(lián)合(Union)、交(Intersection)、差(Difference) 和對稱差集等數(shù)學(xué)運算。
Python符號 集合對象的方法 含義 s1 & s2 s1.intersection(s2) 返回s1 與 s2 的交集 s1 | s2 s1.union(s2) 返回 s1 與 s2 的并集 s1-s2 s1.difference(s2) 返回s1 與 s2 的差集 s1^s2 s1.symmetric_difference(s2) 返回 s1與s2的對稱差 x in s1 測試x是否是s1的成員 x not in s1 測試 x 是否不是s1的成員 s1 <= s2 s1.issubet(s2) 測試是否s1 是 s2 的子集 s1 >= s2 s1.issuperset(s2) 測試是否s1 是 s2 的超集 s1.isdisjoint(s2) 測試s1和s2是否有交集 s1 |= s2 s1.update(s2) 用 s2 更新 s1 集合的使用舉例:
>>> s1 = {'a','e','i','o','u'} >>> s2 = {'a','b','c','d','e'} >>> s1 {'a','e','i','o','u'} >>> s2 {'a','b','c','d','e'} >>> a1 & s2 {'a', 'e'} >>> a1 | s2 {'b', 'i', 'c', 'o', 'a', 'd', 'e', 'u'} >>> s3 = {'a','e'} >>> s3.issubset(s1) True >>> s1.issuperset(s3) True >>> s1.difference(s2) {'i', 'o', 'u'} >>> s1.symmetric_difference(s2) {'b', 'i', 'c', 'o', 'u', 'd'} >>> 'a' in s1 True
集合是可以修改的數(shù)據(jù)類型,但集合中的元素必須是不可修改的。換句話說,集合中元素只能是數(shù)值、字符串、元組之類。由于集合是可修改的,因此集合中的元素不能是集合。但是Python另外提供了frozenset()函數(shù),來創(chuàng)建不可修改的集合,可作為字典的key,也可以作為其他集合的元素,例如:
{frozenset({1,2,3}):'frozenset','Python':3.4},{frozenset({1,2,3}),'a'}
。