Python中的四種資料結構
Python中的內建資料結構(Built-in Data Structure):列表list、元組tuple、字典dict、集合set,涵蓋的僅有部分重點。
一、列表list
list的顯著特徵:
- 列表中的每個元素都可變的,意味著可以對每個元素進行修改和刪除;
- 列表是有序的,每個元素的位置是確定的,可以用索引去訪問每個元素;
- 列表中的元素可以是Python中的任何物件;
- 可以為任意物件就意味著元素可以是字串、整數、元組、也可以是list等Python中的物件。
----資料操作:
1、直接建立列表
mylist = ['Google', 'Yahoo', 'Baidu']
2、對列表中的指定位置變更資料
mylist = ['Google', 'Yahoo', 'Baidu'] #變更索引位置1Yahoo的內容為Microsoft mylist[1] = 'Microsoft' #執行結果: ['Google', 'Microsoft', 'Baidu']
3、在列表後面追加元素
mylist.append('Alibaba') #執行結果: ['Google', 'Microsoft', 'Baidu', 'Alibaba']
4、在指定位置插入元素
mylist.insert(1, 'Tencent') # ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba']
5、刪除元素
mylist = ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba'] # 刪除尾部元素 mylist.pop() # 會返回被刪除元素 # 刪除指定位置的元素 mylist.pop(1) # 刪除索引為1的元素,並返回刪除的元素 mylist.remove('Microsoft') #刪除列表中的Microsoft del mylist[1:3] #刪除列表中索引位置1到位置 3 的資料
6、替換元素
mylist[0] = 'Baidu' mylist[1] = ['python', 'java', 'php'] # 集合的資料型別可以不同,也可以是集合
7、列表排序
mylist = [1, 2, 5, 4] mylist.sort() # [1, 2 ,4, 5]
如果列表裡面是字母,則根據Ascii碼來排序
8、獲取列表長度
mylist = [1, 2, 5, 4]
len(mylist)
9、獲取列表指定位置的資料
mylist = ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba','Sina'] #獲取索引位置1的資料 mylist[1] #'Tencent' #獲取索引位置1到5的資料,注意這裡只會取到索引位置4,這裡叫做取頭不取尾 mylist[1:5] # 'Tencent', 'Microsoft', 'Baidu', 'Alibaba' #獲取從最頭到索引位置5的資料 mylist[ :5] #'Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba' #獲取從索引位置2開到最後的資料 mylist[2:] #'Microsoft', 'Baidu', 'Alibaba','Sina'
10、用迴圈來建立列表
a = [1,2,3,4,5,6] #在a的資料基礎上每個資料乘以10,再生成一個列表b, b = [i*10 for i in a] print(a) print(b) #執行結果如下: # [1, 2, 3, 4, 5, 6] # [10, 20, 30, 40, 50, 60]
11、過濾列表中的內容放入新的列表中
#生成一個從1到20的列表 a = [x for x in range(1,20)] #把a中所有偶數生成一個新的列表b b = [m for m in a if m % 2 == 0] print(b) #執行結果如下: # [2, 4, 6, 8, 10, 12, 14, 16, 18]
12、巢狀式生成列表
#生成一個列表a a = [i for i in range(1,4)] print(a) #生成一個列表b b = [i for i in range(100,400) if i % 100 == 0] print(b) # 巢狀式 c = [m+n for m in a for n in b] print(c) #執行結果: # [1, 2, 3] # [100, 200, 300] # [101, 201, 301, 102, 202, 302, 103, 203, 303]
Python中包含6中內建的序列:列表,元組,字串、Unicode字串、buffer物件和xrange物件。
----list函式
>>> list("Hello world") ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
可以通過list將序列建立為列表。
其實list為一種型別並非函式,但此處二者並無多大區別。下面的tuple、dict也是如此。
二、元組tuple
重點:元組Tuple,用法與List類似,但Tuple一經初始化,就不能修改,沒有List中的append(), insert(), pop()等修改的方法,只能對元素進行查詢
下面看個例子來證實一下我們說的:
>>> a = (1,2,3,4) >>> a (1, 2, 3, 4) >>> print(type(a)) <class 'tuple'> >>> a[1]=5 Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> a[1]=5 TypeError: 'tuple' object does not support item assignment >>> a[1:1] = 5 Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> a[1:1] = 5 TypeError: 'tuple' object does not support item assignment >>> a[1] 2
從上面的例子,證實了tuple不支援對元素的修改(包括刪除),tuple一初始化便固定下來了。
再來看一個例子:
>>> a = ('a','b',['A','B']) >>> print(type(a)) #檢測a的資料型別是什麼 <class 'tuple'> #檢測出a的型別是元組tuple >>> print(a) ('a', 'b', ['A', 'B']) >>> a[2][0] = 'X' #嘗試變更資料,成功了,為什麼? >>> a[2][1] = 'y' >>> print(a) #打印出變更後的內容 ('a', 'b', ['X', 'y']) >>> print(type(a[2])) #檢測a的資料型別是什麼 <class 'list'> #檢測出a[2]的型別是list
這裡看似元素中的元素改變了,可是仔細分析下,元組中的第三個元素是一個列表。
程式碼4,5行改變的是列表中的值,元組所指的這個元素列表並沒有改變,需要注意這點!
這就涉及到Python中的可變物件和不可變物件,像list這樣的就是可變物件,tuple便是不可變物件。
元組是固定的列表,那麼元組的意義何在呢?
因為tuple不可變,所以程式碼更安全。如果可能,能用tuple代替list就儘量用tuple並且需要注意元組中元素的可變性!!
空的tuple可以記為(),若只有一個元素的tuple記為(1,)
t = (1,) # 如果需要是Tuple,就必須加上逗號,否則變成成了數字1了 # 這裡如果沒有“,”就變成了“(1)”
因為記為(1)的話,這個實際代表的是數字1,此時()是數學公式中的小括號
因為元組是固定的列表,所以其內建的大多數的方法和列表是差不多的。
可以通過tuple將序列轉換為元組,用法和list一樣
>>> tuple('Hello,world!') ('H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!')
三、字典dict(dictionary)
字典dictionary全稱這個概念就是基於現實生活中的字典原型,生活中的使用名稱-內容對資料進行構建,Python中使用鍵(key)-值(value)儲存,也就是java、C++中的map。
dict的顯著特徵:
- 字典中的資料必須以鍵值對的形式出現,即k,v:
key:必須是可雜湊的值,比如intmstring,float,tuple,但是,list,set,dict不行
value:任何值
- 鍵不可重複,值可重複
鍵若重複字典中只會記該鍵對應的最後一個值
- 字典中鍵(key)是不可變的,何為不可變物件,不能進行修改;而值(value)是可以修改的,可以是任何物件。
在dict中是根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。
----字典生成建立方式
#建立空字典1 d = {} print(d) #建立空字典2 d = dict() #直接賦值方式 d = {"one":1,"two":2,"three":3,"four":4} #常規字典生成式 dd = {k:v for k,v in d.items()} print(dd) #加限制條件的字典生成方式 ddd = {k:v for k,v in d.items() if v % 2 ==0} print(ddd)
----字典的常見操作_____訪問、刪除、變更字典裡面的內容
#訪問字典中的資料 d = {"one":1,"two":2,"three":3,"four":4} print(d["one"]) #變更字典裡面的資料 d["one"] = "eins" print(d) #刪除一個數據,使用del del d["one"] print(d) #執行結果如下: 1 {'one': 'eins', 'two': 2, 'three': 3, 'four': 4} {'two': 2, 'three': 3, 'four': 4}
----字典中成員檢測
d = {"one":1,"two":2,"three":3,"four":4} if 2 in d: print("value") if "two" in d: print("key") if ("two",2) in d: print("kv")
----使用for迴圈訪問字典
d = {"one":1,"two":2,"three":3,"four":4} #使用for迴圈,直接按key值訪問 for k in d: print(k,d[k]) #上述程式碼也可以寫成如下 for k in d.keys(): print(k,d[k]) #只訪問字典的值 for v in d.values(): print(v) #以下是特殊用法 for k,v in d.items(): print(k,'--->',v)
----字典相關函式
通用函式:len,max,min,dict
d = {"one":1,"two":2,"three":3,"four":4} print(max(d)) print(min(d)) print(len(d))
dict() 函式的使用方法:
dict0 = dict() # 傳一個空字典 print('dict0:', dict0) dict1 = dict({'three': 3, 'four': 4}) # 傳一個字典 print('dict1:', dict1) dict2 = dict(five=5, six=6) # 傳關鍵字 print('dict2:', dict2) dict3 = dict([('seven', 7), ('eight', 8)]) # 傳一個包含一個或多個元祖的列表 print('dict3:', dict3) dict5 = dict(zip(['eleven', 'twelve'], [11, 12])) # 傳一個zip()函式 print('dict5:', dict5)
str(字典):返回字典的字串格式
d = {"one":1,"two":2,"three":3,"four":4} print(str(d))
clear:清空字典
items:返回字典的鍵值對組成的元組格式
d = {"one":1,"two":2,"three":3,"four":4} i = d.items() print(type(i)) print(i) d.clear() print(d)
keys:返回字典的鍵組成的一個結構
d = {"one":1,"two":2,"three":3,"four":4} k = d.keys() print(type(k)) print(k)
values:返回字典的值組成的一個結構
d = {"one":1,"two":2,"three":3,"four":4} v = d.values() print(type(v)) print(v)
get:根據制定鍵返回相應的值,好處是可以設定預設值
d = {"one":1,"two":2,"three":3,"four":4} print(d.get("one333")) #get預設值是None,可以設定 print(d.get("one",100)) print(d.get("one222",100))
fromkeys:使用指定的序列作為鍵,使用一個值作為字典的所有的鍵的值
p = ["one","two","three","four",] #注意fromkeys兩個引數的型別 #注意fromkeys的呼叫主體 d = dict.fromkeys(p,"222") print(d)
四、集合set
- 集合更接近數學上集合的概念。集合中每個元素都是無序的、不重複的任意物件。
- 可以通過集合去判斷資料的從屬關係,也可以通過集合把資料結構中重複的元素減掉。集合可做集合運算,可新增和刪除元素。
- 集合內資料無序,即無法使用索引和分片
- 集合內部資料元素具有唯一性,可以用來排除重複資料
- 集合內的資料:str,int,float,tuple,冰凍集合等,即內部只能放置可雜湊資料
----集合的定義
#集合的定義,set() s = set() print(type(s)) print(s) #也可以像下面這樣做,大括號內一定要有值,否則定義出的將是一個dict s = {1,2,3,4,5,6,7} print(s)
建立集合時需要用list作為輸入集合,可通過add()方法增加元素,remove()方法刪除元素
s = set([1,2,3]) s.add(6) s.remove(2)
集合的內涵
普通集合內涵
--------以下集合會在初始化後自動過濾掉重複元素
s = {33,1,33,6,9,126,8,6,3,77,88,99,126} print(s)
普通迴圈集合內涵
s = {33,1,33,6,9,126,8,6,3,77,88,99,126} ss = {i for i in s} print(ss)
帶條件的集合內涵
s = {33,1,33,6,9,126,8,6,3,77,88,99,126} sss = {i for i in s if i % 2 ==0} print(sss)
多迴圈集合的內涵
s1 = {1,2,3,4} s2 = {"nice","to","meet","you"} s = {m*n for m in s2 for n in s1} print(s)
----集合函式
- intersection:交集
- difference:差集
- union:並集
- issubset:檢查一個集合是否為另一個子集
- issuperset:檢查一個集合是否為另一個超集
通過程式碼來看區別:
s1 = {1,2,3,4,5,6,7} s2 = {5,6,7,8,9} #交集 s_1 = s1.intersection(s2) print("交集:",s_1) #差集 s_2 = s1.difference(s2) print("差集:",s_2) #並集 s_3 = s1.union(s2) print("並集:",s_3) #檢查一個集合是否為另一個子集 s_4 = s1.issubset(s2) print("檢查子集結果:",s_4) #檢查一個集合是否為另一個超集 s_5 = s1.issuperset(s2) print("檢查超集結果:",s_5)
這裡是執行結果:
交集: {5, 6, 7} 差集: {1, 2, 3, 4} 並集: {1, 2, 3, 4, 5, 6, 7, 8, 9} 檢查子集結果: False 檢查超集結果: False
frozen set:冰凍集合
- 冰凍集合是不可以進行任何修改的集合
- frozenset是一種特殊集合
建立冰凍集合的方式:
s = frozenset()
每天進步一點點,不要停止前進的腳步